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
我不明白为什么在第一种情况下,地图分配没有完成?有什么我想念的吗?
答案 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()可以。
我不明白为什么在第一种情况下,地图分配没有完成?
完成了。你错了。