当前位置: 首页 > 面试题库 >

Java:在运行时扩展类

许曦
2023-03-14
问题内容

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

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

我没有足够的程序访问权限来更改实例化到我的子类或中断原始实例化。

用例:现有一个类X实例的数组。我的代码在之后加载。我需要使用已加载的子类Y扩展X来覆盖实例X之一的方法之一。父程序仅通过该数组访问对象,因此我想用Y实例替换该数组元素,但是它需要就像原始实例化到该数组中一样。我不能只封装超类实例并转发调用,而重新实例化超类存在困难。

我希望这一点更加清楚。


问题答案:

重申您要执行的操作。

在JVM中,存在ClassA的实例。您想动态地修改ClassA的类层次结构,以便存在一个新类ClassB,该类继承自ClassA。然后,您想实例化ClassB的实例,但是让它的子类实现是ClassA的现有实例的实现。类似于内存替换。

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

更新资料

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

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

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



 类似资料:
  • 问题内容: 所以对于这个项目,我试图在运行时扩展一个类。我想知道,这有可能吗?如果是这样,我该怎么办?是否有用于这些目的的库? 问题答案: CGLib是您要查找的库。它在扩展类或在运行时实现接口方面非常强大,因此许多流行的框架(如Spring或Hibernate)都使用它。 您可以使用以下代码创建类扩展 尽管您可能会使用具有所需逻辑的有用的方法拦截器替换回调。

  • Windows运行时组件是自包含的对象,可以从任何语言(包括 C# ,Visual Basic,JavaScript和C++)实例化和使用。 除了在上一章中看到的.NET Core元包之外,UWP应用程序还有一个默认的引用 - 通用Windows SDK。 通用Windows是对Windows运行时的引用,它已被考虑到一系列API契约中。 设备系列中的一组API被分解为称为API契约的细分。可以在

  • 问题内容: 我需要允许客户端用户在运行时扩展JPA实体包含的数据。换句话说,我需要在运行时向实体表添加一个 虚拟列 。该 虚拟列 将仅适用于某些 数据行, 并且可能有很多这些 虚拟列 。因此,我不想在数据库中创建实际的其他列,而希望使用代表这些 虚拟列 的其他实体。 例如,请考虑以下情况。我有一个 Company 实体,其字段标记为 Owner ,其中包含对 Company Owner 的引用。在

  • 我不确定我在这里使用的词汇,如果我错了,请纠正我。 在Javascript中,我有以下代码: 如您所见,当调用时,我可以使用spread运算符,以便将我的参数“转换”为。 现在,我正试图用Java做同样的事情。 假设我有一门课: 现在我想调用: 我想使用类似于的东西,而不是调用。 我在函数声明中看到了这一点,但我不想改变这样一个函数的实现。

  • 当我为我的项目运行我的bitbucket管道时,我在颤振测试期间得到一个错误: /root/.pub-cache/hosted/pub.dartlang.org/firebase_core-1.24.0/lib/src/firebase_app.dart: 18:25:错误:未找到成员:'FirebaseAppPlatform.verify扩展'。FirebaseAppPlatform.verif

  • 问题内容: 如何测试是否是的子类? 问题答案: 您是否在寻找: