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

时间:2011-04-14 03:24:16

标签: java oop design-patterns reflection

我正在实例化这样的类。

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

我怀疑的是,如果我们有一个带参数的构造函数,我们如何像上面那样实例化它。

谢谢,
纳伦德拉

3 个答案:

答案 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[]总是调用默认构造函数。

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

  1. 您必须通过传递getDeclaredConstructor来获取带有参数类型的构造函数    适用于Object[]
  2. 的方法
  3. 您必须通过传递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}); } } 方法
  4. 查看示例代码。

    java NewInstanceDemo
    Default constructor
    Two parameter constructor : int,long => 1:2
    

    输出:

    {{1}}

    有关详细信息,请查看oracle documentation页面。

答案 2 :(得分:1)

如果您要根据string "fully qualified class name here"选择要创建的对象类型,则最有可能,您应该用策略模式替换它。