【问题标题】:Extending class at runtime在运行时扩展类
【发布时间】:2013-10-14 13:30:15
【问题描述】:

所以对于这个项目,我试图在运行时扩展一个类。 我想知道的是,这甚至可能吗?如果是这样,我会怎么做?有这些东西的图书馆吗?

【问题讨论】:

  • 你到底为什么要这么做?请澄清用例。我怀疑这是否可能。

标签: java reflection runtime extend


【解决方案1】:

CGLib 是您正在寻找的库。它在扩展类或在运行时实现接口方面非常强大,因此许多流行的框架,如 Spring 或 Hibernate 都使用它。

您可以使用类似的代码创建类扩展

 public Object createProxy(Class targetClass) {
    Enhancer enhancer = new Enhancer();
    enhancer.setSuperclass(targetClass);
    enhancer.setCallback(NoOp.INSTANCE);
    return enhancer.create();
   }

尽管您可能会将NoOp 回调替换为具有所需逻辑的有用方法拦截器。

【讨论】:

    【解决方案2】:

    是的,可以在运行时扩展一个类。尝试一个能够在运行时修改字节码的库,例如javassistASM

    【讨论】:

      【解决方案3】:

      答案取决于您对“扩展课程”的含义。在 java 中,“扩展”意味着声明另一个扩展第一个类(是子类)的类。因此,如果您想创建给定类的子类,这是可能的 - 只需准备一个表示子类的字节数组并将其传递给类加载器。

      如果您想向现有类添加字段或方法,这只能在加载该类时进行,并且通过替换字节数组表示来完成。如果类已经加载,你不能以任何方式修改它。

      【讨论】:

      • 我只是想动态选择要扩展的类(因为类的类路径不断变化)。
      猜你喜欢
      • 2018-07-30
      • 1970-01-01
      • 2020-07-23
      • 1970-01-01
      • 2015-11-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-03
      • 2021-11-14
      相关资源
      最近更新 更多