gpt4 book ai didi

Java:在运行时扩展类

转载 作者:搜寻专家 更新时间:2023-10-30 21:27:42 25 4
gpt4 key购买 nike

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

这在理论上应该是可能的,因为父类(super class)构造函数已经在子类构造函数之前被调用。

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

用例:有一个现有的 X 类实例数组。我的代码在之后加载。我需要用我加载的子类 Y 扩展 X 覆盖其中一个实例 X 的方法之一。父程序仅通过该数组访问对象,因此我想用我的 Y 实例替换该数组元素,但它需要表现得好像它最初被实例化到该数组中一样。我不能只包含父类(super class)实例并转发调用,并且重新实例化父类(super class)会遇到困难。

我希望这更清楚。

最佳答案

重申你正在尝试做的事情..

在 JVM 中,存在一个 ClassA 实例。您想要动态修改 ClassA 的类层次结构,以便存在一个名为 ClassB 的新类,它派生自 ClassA。然后您想实例化 ClassB 的一个实例,但它的子类实现是 ClassA 的现有实例的子类实现。类似内存替换的东西。

您可能想查看 http://www.jboss.org/javassist .您需要做的是替换 ClassLoader,然后确定何时加载 ClassA,然后实例化。然后,您需要构造 ClassB 并将其返回。

更新

经过更多研究后,您仍有可能做自己想做的事。像 Eclipse 这样的 IDE 在调试时支持 HotSwap 方法实现。他们使用 Instrumentation API。

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

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

关于Java:在运行时扩展类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10046056/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com