使用 Class.forName() 初始化一个类,该类具有一个接受参数的构造函数
2022-09-01 10:24:49
我正在实例化这样的类。
myObj = (myObj) Class.forName("fully qualified class name here").newInstance();
我在这里的疑问是,如果我们有一个接受参数的构造函数,我们如何像上面一样实例化它。
谢谢 纳
伦德拉
我正在实例化这样的类。
myObj = (myObj) Class.forName("fully qualified class name here").newInstance();
我在这里的疑问是,如果我们有一个接受参数的构造函数,我们如何像上面一样实例化它。
谢谢 纳
伦德拉
使用 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);
您必须知道需要将哪些参数传递给构造函数。如果这不合适,您应该考虑使用一个空构造函数。然后有方法来设置你通常传递到构造函数中的内容。
有人可能会问你在这里是否有正确的模式。你真的需要使用反射吗,也许有更好的方法?如果您知道自己已经要投射到对象上,为什么不正常构建它呢?您可能希望提供更多上下文,说明为什么需要执行此操作。有正当的理由,但你没有说明任何理由。
newInstance()
始终调用默认构造函数。
如果要调用参数化构造函数,
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
查看 oracle 文档页面了解更多详情。