反射 - 动态地将对象转换为Java中的SuperClass

时间:2017-04-05 02:22:18

标签: java reflection

我正在尝试在运行时将未知类型的对象转换为未知的超类。我认为最好的方法是使用反射,但它似乎没有达到预期的效果。以下是Laptop扩展Device的示例代码块:

Laptop obj1 = new Laptop();
System.out.println(obj1.getClass().getName());

String className = obj1.getClass().getSuperclass().getName();
System.out.println(className);
    Object newObj;
    try {
        newObj = Class.forName(className).cast(obj1);
        System.out.println(newObj.getClass().getName());

    } catch (ClassNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

所以我希望在控制台上看到以下内容:

package.Laptop
package.Device
package.Device

但相反,我得到了:

package.Laptop
package.Device
package.Laptop

对我来说,obj1没有像我期望的那样转换为父类型Device?

有谁能让我知道我做错了什么,或者是否有更好的方法来完成我想要做的事情?

1 个答案:

答案 0 :(得分:1)

(你的代码中有一个拼写错误。第三个sysout尝试打印在你的代码中没有声明的obj,我回答假设你正在尝试打印newObj)

如果您反编译并查看Class类的代码,则cast方法如下所示:

public T cast(Object arg0) {
    if (arg0 != null && !this.isInstance(arg0)) {
        throw new ClassCastException(this.cannotCastMsg(arg0));
    } else {
        return arg0;
    }
}

如此有效,您的代码就是这样:

Object newObj = (Device) obj1;
System.out.println(newObj.getClass().getName());

这里,newObj只是对已经在内存中的同一对象obj1的新引用。 对newObj上方法的所有调用都是对obj1方法的调用,这些方法已经存在于内存中并且属于Laptop类型。所以getClass()。getName()将返回"笔记本电脑"。