【发布时间】:2011-08-05 05:12:16
【问题描述】:
我正在实例化一个这样的类。
myObj = (myObj) Class.forName("fully qualified class name here").newInstance();
我的疑问是,如果我们有一个带参数的构造函数,我们如何像上面那样实例化它。
谢谢,
纳伦德拉
【问题讨论】:
标签: java oop design-patterns reflection
我正在实例化一个这样的类。
myObj = (myObj) Class.forName("fully qualified class name here").newInstance();
我的疑问是,如果我们有一个带参数的构造函数,我们如何像上面那样实例化它。
谢谢,
纳伦德拉
【问题讨论】:
标签: java oop design-patterns reflection
使用Class.getConstructor() 并为此致电Constructor.newInstance()。例如,如果这是您在 Foo 类上的构造函数:
public Foo(String bar, int baz) {
}
你必须这样做:
Constructor c = Class.forName("Foo").getConstructor(String.class, Integer.TYPE);
Foo foo = (Foo) c.newInstance("example", 34);
您必须知道需要将哪些参数传递给构造函数。如果这不是可取的,您应该考虑使用一个空的构造函数。然后有方法来设置你通常传递给构造函数的内容。
不过,有人可能会问您这里的模式是否正确。你真的需要使用反射,也许有更好的方法?如果你知道你将要转换到你的对象,为什么不直接构造它呢?您可能想提供更多关于为什么需要这样做的背景信息。有正当理由,但您没有说明任何理由。
【讨论】:
如果您根据string "fully qualified class name here" 选择要创建的对象类型,则很有可能可以,您应该将其替换为策略模式。
【讨论】:
newInstance() 总是调用默认构造函数。
如果你想调用参数化的构造函数,
Class[] 来获取具有参数类型的构造函数
对于 getDeclaredConstructor 类的方法Object[] fornewInstance() 构造函数的方法来创建构造函数实例看看示例代码。
import java.lang.reflect.*;
class NewInstanceDemo{
public NewInstanceDemo(){
System.out.println("Default constructor");
}
public NewInstanceDemo(int a, long b){
System.out.println("Two parameter constructor : int,long => "+a+":"+b);
}
public NewInstanceDemo( int a, long b, String c){
System.out.println("Three parameter constructor : int,long,String => "+a+":"+b+":"+c);
}
public static void main(String args[]) throws Exception {
NewInstanceDemo object = (NewInstanceDemo)Class.forName("NewInstanceDemo").newInstance();
Constructor constructor1 = NewInstanceDemo.class.getDeclaredConstructor( new Class[] {int.class, long.class});
NewInstanceDemo object1 = (NewInstanceDemo)constructor1.newInstance(new Object[]{1,2});
}
}
输出:
java NewInstanceDemo
Default constructor
Two parameter constructor : int,long => 1:2
查看 oracle documentation 页面了解更多详情。
【讨论】: