【问题标题】:Initializing a class with Class.forName() and which have a constructor which takes arguments用 Class.forName() 初始化一个类,它有一个带参数的构造函数
【发布时间】:2011-08-05 05:12:16
【问题描述】:

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

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

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

谢谢,
纳伦德拉

【问题讨论】:

    标签: java oop design-patterns reflection


    【解决方案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】:

      如果您根据string "fully qualified class name here" 选择要创建的对象类型,则很有可能可以,您应该将其替换为策略模式

      【讨论】:

        【解决方案3】:

        newInstance() 总是调用默认构造函数。

        如果你想调用参数化的构造函数,

        1. 您必须通过传递Class[] 来获取具有参数类型的构造函数 对于 getDeclaredConstructor 类的方法
        2. 您必须通过传递Object[] for
          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 documentation 页面了解更多详情。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-06-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多