Java:在运行时扩展类

2022-09-04 21:26:28

我有能力在编译时扩展一个类,但我需要能够在运行时使用已经实例化的超类的实例创建这个子类的实例。

这在理论上应该是可能的,因为超类构造函数已经在子类构造函数之前调用了。

我没有足够的访问权限来访问程序,无法将实例化更改为我的子类,也无法中断原始实例化。

用例:存在一个类 X 的实例数组。我的代码在之后加载。我需要用加载的子类 Y 扩展 X 覆盖其中一个实例 X 的方法之一。父程序仅通过该数组访问对象,因此我想将该数组元素替换为我的 Y 实例,但它的行为需要像最初实例化到该数组中一样。我不能只包含超类实例并转发调用,并且重新确认超类存在困难的复杂性。

我希望这一点更加明确。


答案 1

重申您正在尝试执行的操作。

在 JVM 中,存在一个 ClassA 实例。您希望动态修改 ClassA 的类 heiarchy,以便存在一个名为 ClassB 的新类,该类派生自 ClassA。然后,您希望实例化 ClassB 的实例,但让它的子类实现是 ClassA 现有实例的子类实现。类似于内存更换。

您可能想研究 http://www.jboss.org/javassist。您需要做的是替换类加载器,然后确定何时加载类 A,然后实例化。然后,您需要构造 ClassB 并返回该类。

更新

经过更多的研究,你仍然有可能做你想做的事。像Eclipse这样的IDE在调试时支持HotSwap'ing方法实现。它们使用检测 API。

http://zeroturnaround.com/blog/reloading_java_classes_401_hotswap_jrebel/

可以替换方法主体,但不能添加或删除方法本身。因此,虽然您无法将类型更改为新类型,但可以将方法实现完全替换为新实现。


答案 2

我建议使用cglib

cglib是一个功能强大,高性能和高质量的代码生成库,它用于扩展JAVA类并在运行时实现接口

您可以在此处找到一些示例:https://github.com/cglib/cglib/wiki


推荐