私は質問を探していました: 文字列名からクラスをインスタンス化する これは、名前を持つときにクラスをインスタンス化する方法を説明します。 Javaでそれを行う方法はありますか?パッケージ名とクラス名があり、その特定の名前を持つオブジェクトを作成できる必要があります。
二つの方法:
クラスに引数なしのコンストラクタがある場合、Class.forName()
を使用してClass
オブジェクトを取得し、newInstance()
メソッドを使用してインスタンスを作成できます(ただし、このメソッドは多くの場合 考慮された悪 Javaのチェックされた例外を無効にすることができるため)。
例えば:
Class<?> clazz = Class.forName("Java.util.Date");
Object date = clazz.newInstance();
クラスに引数なしのコンストラクタがない場合にも機能する別のより安全なアプローチは、クラスオブジェクトを照会してConstructor
オブジェクトを取得し、このオブジェクトでnewInstance()
メソッドを呼び出すことです。
Class<?> clazz = Class.forName("com.foo.MyClass");
Constructor<?> constructor = clazz.getConstructor(String.class, Integer.class);
Object instance = constructor.newInstance("stringparam", 42);
どちらの方法も reflection として知られています。通常、次のようなものを含む、発生する可能性のあるさまざまな例外をキャッチする必要があります。
MyClass myInstance = (MyClass) Class.forName("MyClass").newInstance();
use Class.forName( "クラスの文字列名").newInstance();
Class.forName("A").newInstance();
これにより、Aという名前のクラスが初期化されます。
Class.forName(...)
を使用してインスタンスを作成するためにクラスの完全修飾名を取得しやすくするために、Class.getName()
メソッドを使用できます。何かのようなもの:
class ObjectMaker {
// Constructor, fields, initialization, etc...
public Object makeObject(Class<?> clazz) {
Object o = null;
try {
o = Class.forName(clazz.getName()).newInstance();
} catch (ClassNotFoundException e) {
// There may be other exceptions to throw here,
// but I'm writing this from memory.
e.printStackTrace();
}
return o;
}
}
次に、makeObject(...)
に渡すクラスに戻すオブジェクトをキャストできます。
Data d = (Data) objectMaker.makeObject(Data.class);
Java反射を使用
新しいオブジェクトの作成コンストラクターの呼び出しは新しいオブジェクトの作成と同等であるため、コンストラクターのメソッド呼び出しに相当するものはありません(最も正確には、新しいオブジェクトの作成にはメモリの割り当てとオブジェクトの構築の両方が含まれます)。したがって、前の例に最も近いものは次のとおりです。
import Java.lang.reflect.*;
public class constructor2 {
public constructor2()
{
}
public constructor2(int a, int b)
{
System.out.println(
"a = " + a + " b = " + b);
}
public static void main(String args[])
{
try {
Class cls = Class.forName("constructor2");
Class partypes[] = new Class[2];
partypes[0] = Integer.TYPE;
partypes[1] = Integer.TYPE;
Constructor ct
= cls.getConstructor(partypes);
Object arglist[] = new Object[2];
arglist[0] = new Integer(37);
arglist[1] = new Integer(47);
Object retobj = ct.newInstance(arglist);
}
catch (Throwable e) {
System.err.println(e);
}
}
}
オブジェクトの新しいインスタンスを作成するために、指定されたパラメータータイプを処理して呼び出すコンストラクターを見つけます。このアプローチの価値は、コンパイル時ではなく、実行時にコンストラクターの検索と呼び出しを行う、純粋に動的なことです。
Class.forName( "ClassName") は目的を解決します。
Class class1 = Class.forName(ClassName);
Object object1 = class1.newInstance();
String str = (String)Class.forName("Java.lang.String").newInstance();
このような何かが動作するはずです...
String name = "Test2";//Name of the class
Class myClass = Class.forName(name);
Object o = myClass.newInstance();