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

我正在实例化这样一个类。

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

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

有人可能会问你这里是否有正确的模式。 你真的需要使用reflection,也许有更好的方法吗? 如果你知道你将要投射到你的物体,为什么不正常建造呢? 您可能希望提供更多关于为什么需要执行此操作的上下文。 有正当理由,但您没有说明。

如果您正在选择要创建的对象类型,具体取决于string "fully qualified class name here"那么您很可能也应该使用策略模式替换它。

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

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

  1. 您必须通过为Class[]getDeclaredConstructor方法传递Class[]来获取带有参数类型的Constructor
  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 文档页面。