Class.newInstance()をコンストラクター引数とともに使用できますか?
Class.newInstance()
を使用したいのですが、インスタンス化するクラスにnullaryコンストラクタがありません。したがって、コンストラクター引数を渡すことができる必要があります。これを行う方法はありますか?
MyClass.class.getDeclaredConstructor(String.class).newInstance("HERESMYARG");
または
obj.getClass().getDeclaredConstructor(String.class).newInstance("HERESMYARG");
myObject.getClass().getDeclaredConstructors(types list).newInstance(args list);
編集:コメントによると、クラスとメソッド名を指すことは一部のユーザーにとって十分ではないようです。詳細については、 getting constuctor および invoking it のドキュメントをご覧ください。
次のコンストラクタがあると仮定します
class MyClass {
public MyClass(Long l, String s, int i) {
}
}
このコンストラクタを次のように使用するつもりであることを示す必要があります。
Class classToLoad = MyClass.class;
Class[] cArg = new Class[3]; //Our constructor has 3 arguments
cArg[0] = Long.class; //First argument is of *object* type Long
cArg[1] = String.class; //Second argument is of *object* type String
cArg[2] = int.class; //Third argument is of *primitive* type int
Long l = new Long(88);
String s = "text";
int i = 5;
classToLoad.getDeclaredConstructor(cArg).newInstance(l, s, i);
Class.newInstance()
;を使用しないでください。このスレッドを参照してください: なぜClass.newInstance()evil?
他の答えが言うように、代わりにConstructor.newInstance()
を使用してください。
以下の手順に従って、パラメーター化されたコンストラクターを呼び出します。
Constructor
のgetDeclaredConstructor
メソッドのClass[]
に型を渡すことにより、Class
をパラメーター型で取得しますObject[]
に値を渡すことでコンストラクターインスタンスを作成しますnewInstance
Constructor
のメソッド
サンプルコード:
import Java.lang.reflect.*;
class NewInstanceWithReflection{
public NewInstanceWithReflection(){
System.out.println("Default constructor");
}
public NewInstanceWithReflection( String a){
System.out.println("Constructor :String => "+a);
}
public static void main(String args[]) throws Exception {
NewInstanceWithReflection object = (NewInstanceWithReflection)Class.forName("NewInstanceWithReflection").newInstance();
Constructor constructor = NewInstanceWithReflection.class.getDeclaredConstructor( new Class[] {String.class});
NewInstanceWithReflection object1 = (NewInstanceWithReflection)constructor.newInstance(new Object[]{"StackOverFlow"});
}
}
出力:
Java NewInstanceWithReflection
Default constructor
Constructor :String => StackOverFlow
getConstructor(...) で他のコンストラクターを取得できます。
これはまさにあなたが望むものだと思う http://da2i.univ-lille1.fr/doc/tutorial-Java/reflect/object/arg.html
デッドスレッドのように見えますが、誰かが役に立つかもしれません
クラスのgetDeclaredConstructor
メソッドを使用できます。クラスの配列が必要です。テスト済みの実際の例を次に示します。
public static JFrame createJFrame(Class c, String name, Component parentComponent)
{
try
{
JFrame frame = (JFrame)c.getDeclaredConstructor(new Class[] {String.class}).newInstance("name");
if (parentComponent != null)
{
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
else
{
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
}
frame.setLocationRelativeTo(parentComponent);
frame.pack();
frame.setVisible(true);
}
catch (InstantiationException instantiationException)
{
ExceptionHandler.handleException(instantiationException, parentComponent, Language.messages.get(Language.InstantiationExceptionKey), c.getName());
}
catch(NoSuchMethodException noSuchMethodException)
{
//ExceptionHandler.handleException(noSuchMethodException, parentComponent, Language.NoSuchMethodExceptionKey, "NamedConstructor");
ExceptionHandler.handleException(noSuchMethodException, parentComponent, Language.messages.get(Language.NoSuchMethodExceptionKey), "(Constructor or a JFrame method)");
}
catch (IllegalAccessException illegalAccessException)
{
ExceptionHandler.handleException(illegalAccessException, parentComponent, Language.messages.get(Language.IllegalAccessExceptionKey));
}
catch (InvocationTargetException invocationTargetException)
{
ExceptionHandler.handleException(invocationTargetException, parentComponent, Language.messages.get(Language.InvocationTargetExceptionKey));
}
finally
{
return null;
}
}