Java 基于已编译的 Class 文件的代码生成
Java Code Generation based on compiled Class files
我正在尝试为 POJO classes 生成一个包装器,它将包含一些额外的功能。
因此,对于我的情况,我需要能够根据已编译的 classes(PojoWrapper.java for Pojo.class)生成新的 java 源代码文件。
但我必须完全使用 class 个文件。有两个原因:
我需要 class 的最终形状,但注释处理器可以更改它。例如 Lombok 可能会向 class 添加方法,但对我而言,提前了解这些方法很重要。
我必须能够为我不拥有的 class 生成源代码(第 3 方库)。
显然,注释处理对我不起作用。
我想到的第一个想法是制作一个 Maven 插件,该插件将通过 ASM 库分析生成的二进制 classes。然后我会生成源代码。
但这里有一个棘手的部分:要获得最终的 JAR,我需要编译我的项目两次,第一次生成包装器源代码,然后我需要将所有文件一起编译以构建最终的二进制文件.
在这里,我正在考虑在编译阶段之前单独调用 maven-compile-plugin,这将编译我需要的 classes 的一个子集,之后我将执行我的代码生成,并且然后在编译阶段将编译整个项目。
我的问题是:如何正确执行以下步骤:
- 编译一组 classes,将作为代码生成的基础
- 分析二进制文件并生成java源代码
您可以使用 Java 编译器插件 API(即拦截 javac
编译阶段)。
见
https://docs.oracle.com/javase/8/docs/jdk/api/javac/tree/com/sun/source/util/Plugin.html
我正在尝试为 POJO classes 生成一个包装器,它将包含一些额外的功能。
因此,对于我的情况,我需要能够根据已编译的 classes(PojoWrapper.java for Pojo.class)生成新的 java 源代码文件。
但我必须完全使用 class 个文件。有两个原因:
我需要 class 的最终形状,但注释处理器可以更改它。例如 Lombok 可能会向 class 添加方法,但对我而言,提前了解这些方法很重要。
我必须能够为我不拥有的 class 生成源代码(第 3 方库)。
显然,注释处理对我不起作用。
我想到的第一个想法是制作一个 Maven 插件,该插件将通过 ASM 库分析生成的二进制 classes。然后我会生成源代码。
但这里有一个棘手的部分:要获得最终的 JAR,我需要编译我的项目两次,第一次生成包装器源代码,然后我需要将所有文件一起编译以构建最终的二进制文件.
在这里,我正在考虑在编译阶段之前单独调用 maven-compile-plugin,这将编译我需要的 classes 的一个子集,之后我将执行我的代码生成,并且然后在编译阶段将编译整个项目。
我的问题是:如何正确执行以下步骤:
- 编译一组 classes,将作为代码生成的基础
- 分析二进制文件并生成java源代码
您可以使用 Java 编译器插件 API(即拦截 javac
编译阶段)。
见
https://docs.oracle.com/javase/8/docs/jdk/api/javac/tree/com/sun/source/util/Plugin.html