回答:
二つの方法:
クラスに引数のないコンストラクターがある場合は、メソッドを使用してClass
オブジェクトを取得しClass.forName()
、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);
どちらの方法も反射と呼ばれます。通常、次のようなさまざまな例外をキャッチする必要があります。
newInstance()
、それを自分のオブジェクトにキャストバックできますか?
instance
するにはcom.foo.MyClass
?com.foo.MyClassが単なる文字列であることを考えると
MyClass myInstance = (MyClass) Class.forName("MyClass").newInstance();
使用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);
clazz.newInstance()
代わりにgetName
、その後fromName
?
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 name = "Test2";//Name of the class
Class myClass = Class.forName(name);
Object o = myClass.newInstance();