Java反射:动态创建类实例并将其分配给父对象

时间:2011-07-08 04:18:26

标签: java reflection

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类。我将子类名称作为字符串输入。

我想实例化Child类的对象并将其分配给Parent。我不想将强制转换Child输入到Parent。在后面的代码中,我需要比较两个Child类。如果我将它强制转换为Parent。我无法区分Child1和Child2。

3 个答案:

答案 0 :(得分:3)

我不认为您理解“类型转换”的含义。对象本身绝对没有影响。使用p = (Parent) t只需对t进行运行时检查,以确保t的类型可分配给Parent(即t是{a} {{ 1}}或者它是Parent的子类。之后,Parent仍然是t或其实际类型的所有内容。

使用显式强制转换。

答案 1 :(得分:1)

您可以尝试以下方式:

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

答案 2 :(得分:0)

即使是父母也是由2个不同的孩子组成的

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

parent1和parent2根据每个孩子完全不同。

您可以通过将它们打印为

来看到差异
System.out.println(parent1.getClass().getName());
System.out.println(parent2.getClass().getName());

然后你也可以使用getName()进行比较。

我希望这可能有助于达到要求。

此致

Charlee Ch。