是否有可能在运行时用反射改变类对象的继承层次?
我的情况是:
超类MiddleClass扩展了SuperClass
我想在运行时使用反射来改变BottomClass以扩展MiddleClass。这可能吗?
谢谢
使用Java最接近于此的方法是插装。基本上,您编写一些Java类,这些类获得定义类的一系列字节,处理字节代码,并返回修改后的类文件字节数组。然后将这些类打包到一个JAR文件中,并告诉JVM使用它们,可以在命令行中使用,也可以将一个属性放入检测JAR文件的清单文件中。
当然,如果你这样做,你会想使用一些字节码操作库,如ASM。
EDIT:如果您感兴趣的类实现了接口,您可能希望通过java.lang.reflect.Proxy查看动态代理类。这样做的缺点是,您没有编写的执行new ClassOfInterest()
的代码片段不受影响,但有以下优点:
- 比修改类的字节码容易得多。
- 你可以动态地选择让代理的不同实例表现得像它们有不同的超类。
- 您不必担心任何
SecurityManager
问题。
不,这是不可能通过反射,因为反射是用来分析现有的代码,而不是改变它。
继承是静态的,因此不能在运行时更改。
但是你可以让SuperClass
成为一个接口或者使用委托代替继承。
不可能。例如,如果你已经有一个对象的底部类和你试图改变超类,会发生什么对象?这是不可能的…