-2
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

4 回答 4

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

于 2013-05-16T08:26:58.517 回答
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

于 2013-05-16T08:29:47.070 回答
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);
}
于 2013-05-16T08:29:51.193 回答
0

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

不,但是 newInstance() 可以。

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

它完成了。你误会了。

于 2013-10-22T11:34:35.680 回答