我正在实例化这样的类。
myObj = (myObj) Class.forName("fully qualified class name here").newInstance();
我怀疑的是,如果我们有一个带参数的构造函数,我们如何像上面那样实例化它。
谢谢,
纳伦德拉
答案 0 :(得分:54)
使用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);
您必须知道需要将哪些参数传递给构造函数。如果这不可取,你应该考虑使用一个空的构造函数。然后有方法来设置你通常传递给构造函数的东西。
有人可能会问你这里是否有正确的模式。你真的需要使用反射,也许有更好的方法吗?如果你知道你将要投射到你的物体,为什么不正常建造呢?您可能希望提供更多关于为什么需要执行此操作的上下文。有正当理由,但你没有说明。
答案 1 :(得分:2)
Class[]
总是调用默认构造函数。
如果要调用参数化构造函数,
getDeclaredConstructor
来获取带有参数类型的构造函数
适用于Object[]
类newInstance()
来创建构造函数实例
构造函数的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
输出:
{{1}}
有关详细信息,请查看oracle documentation页面。
答案 2 :(得分:1)
如果您要根据string "fully qualified class name here"
选择要创建的对象类型,则最有可能,您应该用策略模式替换它。