【发布时间】:2019-09-29 22:49:28
【问题描述】:
我正在尝试为包含一些附加功能的 POJO 类生成包装器。
因此,就我而言,我需要能够基于已编译的类(PojoWrapper.java for Pojo.class)生成新的 java 源代码文件。
但我必须完全使用类文件。有两个原因:
我需要类的最终形状,但注释处理器可以更改它。例如,Lombok 可能会向类添加方法,但对我来说,提前了解这些方法很重要。
我必须能够为我不拥有的类(第三方库)生成源代码。
显然,注释处理对我不起作用。
我想到的第一个想法是制作一个 maven 插件,它将通过 ASM 库分析生成的二进制类。然后我会生成源代码。
但这里有一个棘手的部分:要获得最终的 JAR,我需要编译我的项目两次,第一次生成包装器源代码,然后我需要将所有文件编译在一起以构建最终的二进制文件。
在这里,我正在考虑在编译阶段之前对 maven-compile-plugin 进行单独调用,这将编译我需要的类的子集,之后我将执行代码生成,然后在整个编译阶段项目将被编译。
我的问题是:如何正确实施以下步骤:
- 编译一组作为代码生成基础的类
- 分析二进制文件并生成 java 源代码
【问题讨论】:
-
为什么需要重新编译反编译的代码?你在改变它吗?如果是这样,那为什么不直接更改原始代码呢?如果没有,那么你希望通过反编译和重新编译来完成什么?
-
@JosephSible,我不是重新编译,而是生成另一个源文件(更新描述,希望现在更清楚)。
-
您的代码生成是否修改或扩展了代码的API?在生成代码之前,是否有任何内容无法编译?这个问题的答案极大地影响了这个问题的答案。如果您不更改代码的 API,则可以在最后进行所有代码生成。事实上,您可能想研究 AOP 工具(如 AspectJ)来添加您的功能,这可能比自己进行所有字节码操作更简单。
-
@ErwinBolwidt,我的代码生成将扩展 API,但它不应该触及现有的类,相反,我需要基于编译的类生成新的源文件。我有一个例子,假设我需要构建一个源文件,其中包含与我想用作基础的类中的每个 getter 方法相对应的字段列表。我不能使用源代码,因为 Lombok,它稍后会生成 getter,但我需要准备一个源文件,其中将列出 getter,并可供开发人员使用生成的文件编写代码。
标签: java maven compilation bytecode java-bytecode-asm