私はString
クラスの名前が言う"Ex"
(.class
拡張子なし)を持っています。次のClass
ような変数に割り当てたいと思います。
Class cls = (string).class
どうやってやるの?
私はString
クラスの名前が言う"Ex"
(.class
拡張子なし)を持っています。次のClass
ような変数に割り当てたいと思います。
Class cls = (string).class
どうやってやるの?
回答:
Class<?> cls = Class.forName(className);
しかし、あなたclassName
は完全に資格を持っている必要があります-すなわちcom.mycompany.MyClass
className
あなたはどのような価値を渡していますか?クラスパスにそのようなクラスはありますか?
ClassNotFoundException
。秘訣は、try-catchで例外を処理することでした。このようなもの:try { Class<?> cls = Class.forName("com.company.MyClass"); } catch (ClassNotFoundException ex) { /* do something to handle the case when the string isn't valid and therefor the class can't be found */ }
String clsName = "Ex"; // use fully qualified name
Class cls = Class.forName(clsName);
Object clsInstance = (Object) cls.newInstance();
詳細については、ReflectionのJavaチュートリアルトレイル(http://java.sun.com/docs/books/tutorial/reflect/TOC.html)を確認してください。
String clsName = "com.mydoamin.className"; Class cls = Class.forName(clsName);
完全修飾クラス名をパラメーターとしてハードコードしている場合は、正常に機能します。なにか提案を?
次のforName
方法を使用できますClass
:
Class cls = Class.forName(clsName);
Object obj = cls.newInstance();
String clsName = "com.mydoamin.className"; Class cls = Class.forName(clsName);
完全修飾クラス名をパラメーターとしてハードコードしている場合は、正常に機能します。なにか提案を?
clsName
変数に完全修飾クラス名が含まれている場合、それを使用することとハードコードされた文字列に違いはありません。クラスパスに必要なクラスがない可能性があります。スタートアップコードの同じjarから共通のクラスをインスタンス化して、ライブラリがクラスローダーに存在することを確認すると役立つ場合があります。
Class.forName()
メソッドはfinal
変数を期待しています。単純な変数は機能しません。
Java Reflection Conceptを使用して、実行時に任意のクラスのクラス参照を取得できます。
以下のコードを確認してください。以下に説明を示します
返されたクラスを使用してAClassのインスタンスを作成する1つの例を次に示します。
package com.xyzws;
class AClass {
public AClass() {
System.out.println("AClass's Constructor");
}
static {
System.out.println("static block in AClass");
}
}
public class Program {
public static void main(String[] args) {
try {
System.out.println("The first time calls forName:");
Class c = Class.forName("com.xyzws.AClass");
AClass a = (AClass)c.newInstance();
System.out.println("The second time calls forName:");
Class c1 = Class.forName("com.xyzws.AClass");
} catch (ClassNotFoundException e) {
// ...
} catch (InstantiationException e) {
// ...
} catch (IllegalAccessException e) {
// ...
}
}
}
印刷出力は
The first time calls forName:
static block in AClass
AClass's Constructor
The second time calls forName:
クラスはすでにロードされているため、2番目の「AClassの静的ブロック」はありません
説明は以下の通りです
Class.ForNameは、クラスオブジェクトを取得するために呼び出されます
クラスオブジェクトを使用して、クラスの新しいインスタンスを作成しています。
これについて疑問がある場合は私に知らせてください
何を求めているのかわかりませんが... Class.forname、多分?