我可以使用Class.newInstance()与构造函数参数吗?

我想使用Class.newInstance()但我实例化的类没有一个空的构造函数。 因此我需要能够传入构造函数参数。 有没有办法做到这一点?

 Class.getDeclaredConstructor(String.class).newInstance("HERESMYARG"); 
 myObject.getClass().getDeclaredConstructors(types list).newInstance(args list); 

编辑:根据评论似乎指点类和方法名称是不够的一些用户。 有关更多信息,请查看获取构造函数并调用它的文档。

假设你有以下的构造函数

 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()邪恶?

像其他答案一样,使用Constructor.newInstance()来代替。

您可以使用getConstructor(…)获取其他构造函数。

按照以下步骤调用参数化的构造函数。

  1. 通过在Class[]Class getDeclaredConstructor方法传递types来获取带有参数types的Constructor函数
  2. 通过在Object[]传递值来创build构造函数实例
    Constructor newInstance方法

示例代码:

 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 

您可以使用Class的getDeclaredConstructor方法。 它期望一个类的数组。 这里是一个经过testing和工作的例子:

 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; } } 

我想这正是你想要的http://da2i.univ-lille1.fr/doc/tutorial-java/reflect/object/arg.html

虽然它看起来是一个死的线程,但有人可能会觉得它有用