用反射更改java类超类

时间:2011-11-05 20:18:33

标签: java reflection

是否可以使用反射在运行时更改类对象的继承层次结构?

我的情况是:

父类

MiddleClass扩展了SuperClass

BottomClass扩展了SuperClass

我想在运行时使用反射来更改BottomClass以扩展MiddleClass。这可能吗?

感谢

4 个答案:

答案 0 :(得分:5)

使用Java最接近这一点的是instrumentation。基本上你编写了一些Java类,它们给定了一系列定义类的字节,用字节代码来解决,并返回修改后的类文件字节数组。然后,您可以将这些类打包到JAR文件中,并告诉JVM在命令行上使用它们,或者将属性放入检测JAR文件的清单文件中。

当然,如果你这样做,你会想要使用像ASM这样的字节代码操作库。

编辑:如果您感兴趣的课程实现了界面,您可能需要通过dynamic proxy classes查看java.lang.reflect.Proxy。这样做的缺点是你没有编写new ClassOfInterest()的代码片段不受影响,但具有以下优点:

  1. 比修改类的字节代码容易得多。
  2. 您可以动态选择使代理的不同实例表现得像他们有不同的超级类别。
  3. 您不必担心任何SecurityManager问题。

答案 1 :(得分:4)

不,通过反射是不可能的,因为使用反射来分析现有代码,而不是改变它。

答案 2 :(得分:0)

继承是静态的,因此无法在运行时更改。

但是,您可以使SuperClass成为接口或使用委托而不是继承。

答案 3 :(得分:-1)

这是不可能的。例如,如果你已经有一个BottomClass的对象而你正在尝试更改超类,那么该对象会发生什么?这是不可能的......