JAK*_*AKJ 11 java inheritance runtime instantiation
我有能力在编译时扩展一个类,但我需要能够在运行时使用已经实例化的超类的实例创建该子类的实例.
这在理论上应该是可能的,因为超类构造函数已经在子类构造函数之前被调用.
我无法充分访问该程序以将实例化更改为我的子类,也无法中断原始实例化.
用例:存在类X的现有实例数组.我的代码在之后加载.我需要覆盖其中一个实例X的一个方法,我的加载子类Y扩展X.父程序只通过该数组访问对象,所以我想用我的Y实例替换该数组元素,但它需要表现得好像它最初被实例化到该数组中.我不能只包含超类实例和转发调用,并且重新实现超类也很困难.
我希望更清楚.
重申你要做的事情......
在JVM中,存在ClassA的实例.您希望动态修改ClassA的类heiarchy,以便存在一个名为ClassB的新类,它派生自ClassA.然后,您希望实例化ClassB的实例,但是它的子类实现是ClassA的现有实例的实现.像记忆替换的东西.
您可能需要查看http://www.jboss.org/javassist.您需要做的是替换ClassLoader,然后确定何时加载ClassA,然后实例化.然后,您需要构造ClassB并返回它.
更新
经过一番研究后,你仍然有可能做你想做的事.IDE就像Eclipse一样,在调试时支持HotSwap的方法实现.他们使用Instrumentation API.
http://zeroturnaround.com/blog/reloading_java_classes_401_hotswap_jrebel/
您可以替换方法体,但不能自行添加或删除方法.因此,虽然您无法将类型更改为新类型,但您可以使用新实现完全替换方法实现.