使用 Class.forName() 初始化一个类,该类具有一个接受参数的构造函数

2022-09-01 10:24:49

我正在实例化这样的类。

myObj = (myObj) Class.forName("fully qualified class name here").newInstance();

我在这里的疑问是,如果我们有一个接受参数的构造函数,我们如何像上面一样实例化它。

谢谢 纳
伦德拉


答案 1

使用 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);

您必须知道需要将哪些参数传递给构造函数。如果这不合适,您应该考虑使用一个空构造函数。然后有方法来设置你通常传递到构造函数中的内容。

有人可能会问你在这里是否有正确的模式。你真的需要使用反射吗,也许有更好的方法?如果您知道自己已经要投射到对象上,为什么不正常构建它呢?您可能希望提供更多上下文,说明为什么需要执行此操作。有正当的理由,但你没有说明任何理由。


答案 2

newInstance()始终调用默认构造函数。

如果要调用参数化构造函数,

  1. 您必须通过传递类的方法获得具有参数类型的构造函数Class[]getDeclaredConstructor
  2. 您必须通过传递构造函数
    的方法创建构造函数实例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 文档页面了解更多详情。