2013-05-16 2 views
-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 

Я не понимаю, почему в первом случае распределение карты не выполняется? Что-то я пропустил?Действительно ли метод getConstructor() вызывает конструктор?

+0

распределение карты ?? Если вы хотите инициализировать хэш-карту в первом случае, просто вызовите myMalloc() либо на объекте, либо внутри конструктора. Если вы правильно определили myMalloc(), как указано ниже, @Luiggi Mendoza –

+2

Интересно, как ваш код компилируется, так как 'myMalloc' не имеет типа возврата –

+1

@Sudhanshu' myMalloc' не является ни конструктором, ни допустимым методом ... –

ответ

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.

EDIT

Я подозреваю, что вы получите некоторый класс из этого списка, который является подклассом 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); 
} 
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();

0

Метод getConstructorConstructor возвращает объект. Затем объект может быть использован для вызова фактического конструктора.

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

0

getConstructor() действительно вызывает конструктор?

Нет, но newInstance().

Я не понимаю, почему в первом случае распределение карты не было выполнено?

Все готово. Вы ошибаетесь.

Смежные вопросы