是否可以使用反射在运行时更改对象类型?
假设我有一个对象A
的实例。 B extend A
类型的对象。是否可以将A
实例的对象类型更改为B
,以便我可以安全地将A
转换为B
?
可能通过更改最终属性.class或类似技巧?
答案 0 :(得分:3)
不,这是不可能的。
您提到的反射允许在运行时发现给定的类(即按名称查找方法,字段等)并在运行时访问对象的方法和字段,而无需针对特定类编译客户端代码。例如,您可以调用任何类的方法foo()
。
改变对象的类型实际上对我来说根本没有意义。 Object contains是具有数据和方法的特定类的实例。我可以想象使用sun.misc.Unsafe
在运行时更改为对象分配的内存的方法,但是我甚至无法想象如何更改与该对象关联的特定类中完成的方法的实现。
问题仍然存在:为什么?您可以解释一下您的任务并提出解决方案建议吗?
修改
根据OP发布的新信息作为对我的回答的评论,我想添加以下内容。
据我所知,情况如下。
有第三方库实现了类A
和AFactory
。 OP使用如下代码:
A a = AFactory.create();
但他不需要A
。他需要B extends A
来实现其他功能。
可能的解决方案如下。
创建课程B extends A
:
public class B extends A {
private final A a;
public B(A a) {this.a = a;}
// delegate all methods of A, i.e.:
@Override
public boolean isA() {return a.isA()}
// add your functionality, e.g.
public boolean isC() {/* your code here*/}
}
现在使用此类如下:
A a = AFactory.create();
B b = new B(a);
现在,您可以通过A
使用B
的所有功能以及其他功能。