質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

4回答

15825閲覧

文字列からクラスを取得しnew(生成)したい

suu

総合スコア13

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2016/03/24 10:14

java

1public Class takeClass(String str){ 2 3 Class<?> cls = null; 4 try{ 5 // パッケージ名+strの名前のクラスを取得 6 cls = Class.forName("com.sample.test." + str); 7 } catch ( ClassNotFoundException ex ){ 8 ex.printStackTrace(); 9 } 10 return cls; 11} 12

上は名前を渡してクラスを取得するtakeClassメソッドです
クラスを取得したそのあと、newの仕方が分かりません

実際やりたい事は、下のコード「new takeClass("name")」の部分です
(android でのfragmendの切り替え)
動的にクラスをnewしたいです

FragmentManager fragmentManager = getFragmentManager(); FragmentTransaction transaction = fragmentManager.beginTransaction(); transaction.replace( R.id.container, new takeClass("name") ); transaction.commit();

初歩的な質問ですがよろしくお願いします

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

newInstaceメソッドを使えばできます。
しかし、リフレクションを使う必要があるかは疑問ですね。

投稿2016/03/24 10:34

yona

総合スコア18155

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

suu

2016/03/25 05:02

うまく動きました。ありがとうございます。リフレクションについては、よくわからない部分もあり、問題もあるみたいなのでまた調べてみます。
guest

0

投稿2016/03/24 10:22

tkturbo

総合スコア5572

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

suu

2016/03/25 04:58

ありがとうございます
guest

0

こんにちは。
解決されたようなのですが、ちょっと気になってしまったのでコメしました。

引数なしのコンストラクタであれば、

cls = Class.forName("com.sample.test." + str); return cls.newInstance();

でいけます。
ただし、引数ありのコンストラクタしか定義されていなかったり、引数なしコンストラクタがprivateされていたりした場合は、IllegalAccessExceptionが発生してしまいます。

引数ありのコンストラクタを使用する場合は、Classオブジェクトからコンストラクタを一度取得してからnewInstance()するといいと思います。

ちょうどこちらのページで、javaのバージョン毎に詳しく説明してくれているので、参考にしてみてください。
-> リフレクション

投稿2016/03/25 05:40

kaputaros

総合スコア1844

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

suu

2016/03/26 06:16

ありがとうございます。シンプルなコードでいいですね。 詳しいサイトなので助かります
guest

0

見たところコンストラクタに引数が必要なようなので、単純にClassオブジェクトのnewInstance()メソッドを使うことは出来ません。代わりにConstructorクラスのnewInstance()メソッドを使います。

clsという変数にClassのオブジェクトが入ってたとします。

Java

1Class<?>[] types = { String.class }; // 引数の型の配列 2Object[] args = {"name"}; // 引数の配列 3Object o = null; 4 5try { 6 Constructor<?> c = cls.getConstructor(types); 7 o = c.newInstance(args); 8} catch (Exception e) { 9 e.printStackTrace(); 10}

こうすればoにインスタンスが入ります。

投稿2016/03/24 11:51

Asmape

総合スコア47

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KiyoshiMotoki

2016/03/24 16:49

"takeClass"はクラスではなく、"Class"クラスを返却するメソッドではないでしょうか?
suu

2016/03/25 05:02

ありがとうございます。参考にさせてもらいます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問