我可以使用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(…)获取其他构造函数。
按照以下步骤调用参数化的构造函数。
- 通过在
Class[]
为Class
getDeclaredConstructor
方法传递types来获取带有参数types的Constructor
函数 - 通过在
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
虽然它看起来是一个死的线程,但有人可能会觉得它有用