2012-04-12 8 views
54

私は自分のアプリケーションにTestActivityと呼ばれるActivityクラスを持っている場合は、この例のようにその名前でそのクラスを取得する方法があります:その名前でクラスを取得

Class<?> c = getClassByName("TestActivity"); 
+0

正しい答えを選択して、あなたが同様に完全なパッケージ名を与える必要があり –

答えて

112

使用はforName代わり..

このような

何か..

try { 
    Class<?> act = Class.forName("com.bla.TestActivity"); 
} catch (ClassNotFoundException e) { 
     e.printStackTrace(); 
} 
+25

ポストを閉じてください。例:com.bla.TestActivityをClass.forNameの引数として受け取ります。 – Richie

+1

'Class <? SomeClass> 'を拡張しますか? – Gobliins

+0

@ゴブリンズいいえ - コンパイラはどのような種類のクラスを取得するのか保証できませんので、クラスが得られます。どのようなクラスを取得するのか分かっているなら、キャストする必要があります(キャストが安全でないため、キャストの警告が未確認であっても)。 – Dylanthepiguy

4

Class.forNameはそれに例外を持っているようです。これは、上記の問題を解決するためのものです。

try { t = Class.forName("com.package.classname"); } catch (Exception ignored){} 
+0

このように答えるための通常の方法は、**答えを編集することです**。 Javaでは例外が豊富であるため(コードでは無視されます)、**コメント**で十分です。 – crazyhatfish

+5

@crazyhatfish - パトリックは何も役に立たないかもしれないように思えるかもしれません。 – amess

+1

@amessおっと、あなたの権利、私はコメントが必要なことを忘れるrep。私を修正してくれてありがとう。 – crazyhatfish

0

Class::forNameを使用すると、不明な種類のクラスオブジェクトを取得できます。あなたは型指定されたクラスを取得したい場合は 、あなたはClass::forNameによって返されたクラスにClass::asSubclassを使用することができます。もちろん

Class<? extends Activity> activityClass = Class.forName("com.example.TestActivity") 
               .asSubclass(Activity.class); 

あなたはまた、例外の異なる種類の束を処理する必要があります。反射を扱うときはいつもそうです。

1

それはあなたの質問に最も関連の答えではないかもしれないが、それは文字列としてクラス名リテラルをハードコーディングすることが一般的に悪いです。使用する方が良いかもしれません。

Class<?> act = TestActivity.class; 

構文です。

関連する問題