Java:如何在Java Reflection中使用非原始类型的constructor.newInstance()?

时间:2010-11-28 19:49:11

标签: java reflection constructor

经过漫长的一天搜索后,如果构造函数采用非原始参数,我仍然无法弄清楚如何从自制类中实现新对象。现在我开始怀疑这是否可行?!

Documentation of Reflection中,就我所见,他们只讨论基本类型(如int,float,boolean等)。我发现的所有其他信息/网站/研讨会/示例也只是考虑原始类型来查找构造函数并实例化一个新实例。

所以我想要做的是以下(细分方案):

假设我有一个名为MyStupidClass的类。另一个类(我们将其命名为MyUsingClass)将MyStupidClass对象作为构造函数中的参数。 现在在我的主应用程序中,我希望能够加载MyUsingClass类并从构造函数中实现对象。

这是我到目前为止发现的“使用反射”:

使用空构造函数:

//the MyUsingClass:
public class MyUsingClass {

   //the public (empty) constructor
   public MyUsingClass() {
      ...
   }
}

在主应用程序中,我现在会做类似的事情:

//get the reflection of the MyUsingClass
Class<?> myUsingClassClass = Class.forName("MyUsingClass");
//get the constructor [I use getConstructor() instead of getConstructors(...) here as I know there is only one]
Constructor<?> myUsingClassConstr = myUsingClassClass.getConstructor();
//instanciate the object through the constructor
Object myInstance = myUsingClassConstr.newInstance(null);

现在,如果我在MyUsingClass中使用一些原始类型,它将类似于:

//the MyUsingClass:
public class MyUsingClass {

   //the public (primitive-only) constructor
   public MyUsingClass(String a, int b) {
      ...
   }
}

在主应用程序中,最后一行将更改为:

//instanciate the object through the constructor
Object myInstance = myUsingClassConstr.newInstance(new Object[]{new String("abc"), new Integer(5)});

到目前为止没有任何问题(上面的代码中可能存在一些小错误,因为它只是一个细分的例子......) 现在线索问题是,如果MyUsingClass看起来像这样,我该如何创建myInstance:

//the MyUsingClass:
public class MyUsingClass {

   //the public (primitive-only) constructor
   public MyUsingClass(String a, int b, MyStupidObject toto) {
      ...
   }
}

?任何帮助,将不胜感激!感谢您阅读我的问题!

迎接sv

3 个答案:

答案 0 :(得分:13)

没问题。很多年前,我也花了很多时间来做这件事。

  1. 只有在调用默认构造函数时才能使用Class.newInstance()
  2. 在所有其他情况下,您必须先调用getConstructor()并调用其newInstance()来找到合适的构造函数。
  3. 当您致电getConstructor()时,请使用int.classlong.classboolean.class来获取基元。如果您的班级Foo有构造函数Foo(int p),则必须说明

    Constructor c = Foo.class.getConstructor(int.class);

  4. 一旦构造函数使用newInstance()调用它:

    c.newInstance(12345);

  5. 对于多参数构造函数,请说:

    `c.newInstance(new Object[] {12345, "foo", true})`
    

    请注意,自java 5以来我们有幸运行自动装箱。对于5之前的版本,我们必须使用更详细的语法:

    `c.newInstance(new Object[] {new Integer(12345), "foo", new Boolean(true)})`
    

    即。我们使用int.class来定位构造函数和Integer类型来调用它。

    我希望这会有所帮助。

答案 1 :(得分:1)

与调用其他类型的构造函数的方式相同:

Object myInstance = myUsingClassConstr.newInstance(new Object[] {
    new String("abc"),
    new Integer(5),
    new MyStupidObject()
});

来自Constructor.newInstance documentation

  

使用此Constructor对象表示的构造函数,使用指定的初始化参数创建并初始化构造函数声明类的新实例。各个参数会自动解包以匹配原始形式参数,并且原始参数和参考参数都会根据需要进行方法调用转换。

参考类型专门列在那里,不需要特殊处理。

答案 2 :(得分:0)

好的,这(所有的答案)帮了我很多。它现在正在工作,至少乍一看。需要进一步测试,但我希望我现在能够独自完成这个测试!

非常感谢...

[他们可能在规范中更具体地讨论这个主题]