Отражение Java: создание экземпляра класса динамически и назначение его родительскому объекту - PullRequest
2 голосов
/ 08 июля 2011
String child = "C";
Parent p = null;
try {
    Class c1 = new Class.forName(child);
    Constructor co = c1.getConstructor();
    // p=co.newInstance(null); //This gives compilatoin error cannot
    // conver object to Parent
    // p=(c1.getClass())co.newInstance(null);//also gives cast errror
    p = (Parent) co.newInstance(null);// this works but it typecasts the
    // child to Parent
} catch (Exception e) {
}

Что я пытаюсь сделать.

У меня есть несколько дочерних классов, унаследованных от Parent. Я получаю имя дочернего класса в виде ввода строки.

Я хочу создать экземпляр объекта класса Child и назначить его для Parent. Я не хочу печатать «Дитя до родителя». Как позже в коде мне нужно сравнить два дочерних класса. Если я приведу это к Parent. Я не могу провести различие между Child1 и Child2.

Ответы [ 3 ]

3 голосов
/ 08 июля 2011

Я не думаю, что вы понимаете, что делает "Typecasting". абсолютно не влияет на сам объект. Использование p = (Parent) t просто выполняет проверку во время выполнения на t, чтобы убедиться, что тип t можно присвоить Parent (то есть либо t is-a Parent, либо это подкласс Parent) После этого t по-прежнему будет Child1 или каким-либо другим типом фактическим .

Используйте явное приведение.

1 голос
/ 08 июля 2011

Вы можете попробовать что-то вроде:

Object parent = null;
String child = String.class.getName();  //not necessary, can just use String.class directly
Class childClass = Class.forName(child);
Class parentClass = Object.class;

if (parentClass.isAssignableFrom(childClass)) {
    parent = childClass.newInstance();
}

System.out.println("Parent is:  " + parent);
0 голосов
/ 08 июля 2011

Даже Родитель отлит из 2 разных детей как

Parent parent1 = (Parent)child1;
Parent parent2 = (Parent)child2;

Parent1 и parent2 полностью различаются в зависимости от каждого ребенка.

Вы можете увидеть разницу, напечатав их как

System.out.println(parent1.getClass().getName());
System.out.println(parent2.getClass().getName());

Затем вы можете сравнить его, используя getName ().

Я надеюсь, что это может помочь выполнить требование.

С уважением,

Чарли Ч.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...