【问题标题】:Generating code in existing classes in runtime (Java)在运行时的现有类中生成代码 (Java)
【发布时间】:2019-12-02 16:15:23
【问题描述】:

我已经创建了一个空类SimpleClass。如何在运行时在此类中生成一些代码并重新编译该类以使用该代码?

public class SimpleClass {}

我找到了使用自定义 ClassLoader 和 javax.tools API 生成整个类及其内容的解决方案。 但是现有的课程有吗?

public class SimpleClass {

    //Generated code in runtime
    public void method() {
       System.out.println("Generated method");
    }

}

【问题讨论】:

  • 你为什么需要这个?根据上下文,其他解决方案可能会起作用,例如您无法在运行时向加载的类添加方法。您可以在编译时执行此操作。您可以在运行时加载类之前执行此操作。您也可以使用该方法生成新类,或扩展此类的新类。很多可能性,也许你甚至不需要生成一个方法,也许是 xyproblem.info 请描述你为什么需要这个。
  • 使用字节码检测 API(如 ASM、Javaassit、ByteBuddy 等),您可以添加/删除方法、文件、方法体等。
  • @GotoFinal,我有一个包含一百多个字段的类,我需要调用具体的方法。方法具有相同的主体但使用不同的字段,例如:public class SimpleClass { private String f1; private String f2; private String f3; public void useF1() { // do some action with f1 } public void useF2() { // do some action with f2 } public void useF3() { // do some action with f3 } }
  • @GotoFinal,我希望这个类只有一个生成的方法,每次我想用具体参数调用它时都会重新编译,比如:public void useF(String fieldName) { // do some action with field with name - fieldName }
  • 为什么你有这样的代码,你不能用地图来做这个吗?这听起来不是个好主意。也许只是用你正在尝试做的真实事情来编辑你的问题,而不是如何。

标签: java reflection runtime classloader code-generation


【解决方案1】:

您可以注册一个 Java 代理以在加载类之前对其进行操作,以包含您想要的方法。为此,您需要编译一个不同的 jar,在其中注册一个 ClassFileTransformer,您可以在其中更改类文件。 Javadoc for the instrument package 为您提供了如何执行此操作的概述。

一旦加载了一个类,大多数 JVM 实现都不允许您添加新方法。

【讨论】:

  • 您也可以在运行时添加代理,但是您需要确保在加载给定类之前运行转换器。编辑:啊,刚刚知道是谁写的答案,你肯定知道。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-23
  • 1970-01-01
  • 2011-01-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多