我正在尝试在运行时将未知类型的对象转换为未知的超类。我认为最好的方法是使用反射,但它似乎没有达到预期的效果。以下是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?
有谁能让我知道我做错了什么,或者是否有更好的方法来完成我想要做的事情?
答案 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()将返回"笔记本电脑"。