getConstructor()真的调用构造函数吗?

时间:2013-05-16 08:21:38

标签: java class reflection constructor

public MyClass {
  public HashMap<String, String> fu;

  public MyClass() {
  fu = new HashMap<>();
  }

  public void myMalloc() {
  fu = new HashMap<>();
  }
}

Class<?> cl = // I get class from list
myObject = (MyClass) cl.getConstructor().newInstance();
System.out.println(myObject.fu) // = null !

Class<?> cl = // I get class from list
myObject = (MyClass) cl.getConstructor().newInstance();
myObject.myMalloc();
// fu is well allocated

我不明白为什么在第一种情况下,地图分配没有完成?有什么我想念的吗?

4 个答案:

答案 0 :(得分:1)

在正确填充缺失的部分时,您的示例工作正常 - 因此您的问题是缺失的部分。在此示例中,fu不为空:

public static void main(String[] args) throws Exception {
    Class<?> cl = MyClass.class;
    MyClass myObject = (MyClass) cl.getConstructor().newInstance();
    System.out.println(myObject.fu);
}

public static class MyClass {

    HashMap<String, String> fu;

    public MyClass() {
        fu = new HashMap<>();
    }

    public void myMalloc() {
        fu = new HashMap<>();
    }
}

注意:您可以摆脱getConstructor,只需致电:(MyClass) cl.newInstance();

答案 1 :(得分:0)

getConstructor方法返回Constructor个对象。然后可以使用该对象来调用实际的构造函数。

Class c = Integer.class;
Constructor constructor = c.getConstructor(String.class);  //Instantiate a Constructor object.
Integer i = (Integer) constructor.newInstance("1");  // calls actual constructor.
System.out.println(i); 

这将打印输出1

答案 2 :(得分:0)

以下测试通过

@Test
public void myClass() throws Exception {
    Class<?> cl = Class.forName("miscellaneous.so.myclass.MyClass");
    MyClass myObject = (MyClass) cl.getConstructor().newInstance();
    Assert.assertNotNull(myObject.fu);

    myObject = (MyClass) cl.getConstructor().newInstance();
    myObject.myMalloc();
    Assert.assertNotNull(myObject.fu);
}

问题很可能出在你获得Class实例的代码中。

修改

我怀疑你从该列表中获得了一些类MyClass的子类,并且MyClass在调用其构造函数时不会初始化fu

public class MyClass {
    HashMap<String, String> fu;

    public void myMalloc() {
        fu = new HashMap<>();
    }
}


public class MyClassSub extends MyClass {

}

在这种情况下,代码的行为与您所描述的相同,并且下面的测试也通过了

@Test
public void myClassSub() throws Exception {
    Class<?> cl = Class.forName("miscellaneous.so.myclass.MyClassSub");
    MyClass myObject = (MyClass) cl.getConstructor().newInstance();
    // Note that here the reference is asserted to be null
    Assert.assertNull(myObject.fu);

    myObject = (MyClass) cl.getConstructor().newInstance();
    myObject.myMalloc();
    Assert.assertNotNull(myObject.fu);
}

答案 3 :(得分:0)

  

getConstructor()真的调用构造函数吗?

不,但是newInstance()可以。

  

我不明白为什么在第一种情况下,地图分配没有完成?

完成了。你错了。