给定一个类层次结构:
A -> B -> C -> instanceOfC
是否可以在运行时临时插入一个类,如下所示:
A -> B -> B' -> C -> instanceOfC?
(译者注:即在B和C之间插入一个新的类B')给定一个类层次结构:
A -> B -> C -> instanceOfC
是否可以在运行时临时插入一个类,如下所示:
A -> B -> B' -> C -> instanceOfC?
(译者注:即在B和C之间插入一个新的类B')如果您使用AspectJ,那么这是可能的。AspectJ有一个declare parents
语句,可以让您做到这一点,并且通过Load Time Weaving,您也应该能够在运行时实现它。但是,您将无法对已加载的类执行此操作(至少不容易,也许如果您先卸载类,它会起作用)。
参考资料:
但我认为您正在尝试解决错误的问题。我建议尝试使用聚合替换继承,让C
拥有类型为D
的成员,将功能委托给它,并传入不同的D
实现。这被称为策略模式,它是一种更清晰的方法(而且也可以进行测试)。
允许对正在运行的JVM进行最深入更改的API可能是JVM工具接口。它旨在开发调试器,可以在运行时动态更改方法以便于进行修复和继续调试。
替换类定义的相关调用将是RedefineClass
。但是,文档指出它不能用于更改类的层次结构:
重新定义不能添加、删除或重命名字段或方法,更改方法的签名、更改修饰符或更改继承关系。
因此,我认为您无法在未修改的JVM中合理地修改已加载的类的类型层次结构。要么在加载期间更改类层次结构(使用自定义ClassLoader
和字节码注入,可能使用AOP),要么找到另一种方法。
不可以。
你可以做:
A -> | interface for B and B` | -> C
或者
| B | -> C
A ->
| B` | -> C`
失去一些良好的习惯,你可以这样做:B + 内部类 = B'
。
例如:
public class B<extraFunctionalityClassOrInterface> extends A {
private extraFunctionalityClassOrInterface eF = null;
// and B contents
}
如果b.eF == null
的实例,则可以得出结论b!= B'
,但b == B
。
我不是百分之百确定,但我认为只有在同时动态加载B'和C时才可能实现这一点。