【问题标题】:Java Code Generation based on compiled Class files [closed]基于已编译类文件的 Java 代码生成 [关闭]
【发布时间】:2019-09-29 22:49:28
【问题描述】:

我正在尝试为包含一些附加功能的 POJO 类生成包装器。

因此,就我而言,我需要能够基于已编译的类(PojoWrapper.java for Pojo.class)生成新的 java 源代码文件。

但我必须完全使用类文件。有两个原因:

  1. 我需要类的最终形状,但注释处理器可以更改它。例如,Lombok 可能会向类添加方法,但对我来说,提前了解这些方法很重要。

  2. 我必须能够为我不拥有的类(第三方库)生成源代码。

显然,注释处理对我不起作用。

我想到的第一个想法是制作一个 maven 插件,它将通过 ASM 库分析​​生成的二进制类。然后我会生成源代码。

但这里有一个棘手的部分:要获得最终的 JAR,我需要编译我的项目两次,第一次生成包装器源代码,然后我需要将所有文件编译在一起以构建最终的二进制文件。

在这里,我正在考虑在编译阶段之前对 maven-compile-plugin 进行单独调用,这将编译我需要的类的子集,之后我将执行代码生成,然后在整个编译阶段项目将被编译。

我的问题是:如何正确实施以下步骤:

  1. 编译一组作为代码生成基础的类
  2. 分析二进制文件并生成 java 源代码

【问题讨论】:

  • 为什么需要重新编译反编译的代码?你在改变它吗?如果是这样,那为什么不直接更改原始代码呢?如果没有,那么你希望通过反编译和重新编译来完成什么?
  • @JosephSible,我不是重新编译,而是生成另一个源文件(更新描述,希望现在更清楚)。
  • 您的代码生成是否修改或扩展了代码的API?在生成代码之前,是否有任何内容无法编译?这个问题的答案极大地影响了这个问题的答案。如果您不更改代码的 API,则可以在最后进行所有代码生成。事实上,您可能想研究 AOP 工具(如 AspectJ)来添加您的功能,这可能比自己进行所有字节码操作更简单。
  • @ErwinBolwidt,我的代码生成将扩展 API,但它不应该触及现有的类,相反,我需要基于编译的类生成新的源文件。我有一个例子,假设我需要构建一个源文件,其中包含与我想用作基础的类中的每个 getter 方法相对应的字段列表。我不能使用源代码,因为 Lombok,它稍后会生成 getter,但我需要准备一个源文件,其中将列出 getter,并可供开发人员使用生成的文件编写代码。

标签: java maven compilation bytecode java-bytecode-asm


【解决方案1】:

【讨论】:

  • 不,这行不通,我还需要分析来自 3rd 方库的编译类
  • 所以加载这些并分析。
  • 插件进程也依赖吗?然后,当我生成新的源文件时,是否可以将它们添加到正在进行的编译中?
  • 插件做任何你写的事情。你不需要生成源文件——你可以像 Lombok 一样直接生成类文件
  • 就我而言,我实际上需要 java 源代码,但不需要字节码
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-24
  • 1970-01-01
  • 2017-09-25
  • 2014-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多