Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于编译类文件的Java代码生成_Java_Maven_Compilation_Bytecode_Java Bytecode Asm - Fatal编程技术网

基于编译类文件的Java代码生成

基于编译类文件的Java代码生成,java,maven,compilation,bytecode,java-bytecode-asm,Java,Maven,Compilation,Bytecode,Java Bytecode Asm,我正在尝试为POJO类生成一个包装器,该包装器将包含一些附加功能 因此,对于我的例子,我需要一种基于编译类PojoWrapper.java for Pojo.class生成新java源代码文件的能力 但我必须准确地使用类文件。原因有两个: 我需要类的最终形状,但是注释处理器可以更改它。例如,Lombok可能会向类中添加方法,但对我来说,提前了解这些方法很重要 我必须能够为我没有第三方库的类生成源代码 显然,注释处理对我来说不起作用 我想到的第一个想法是制作一个maven插件,通过ASM库分析生成

我正在尝试为POJO类生成一个包装器,该包装器将包含一些附加功能

因此,对于我的例子,我需要一种基于编译类PojoWrapper.java for Pojo.class生成新java源代码文件的能力

但我必须准确地使用类文件。原因有两个:

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

我必须能够为我没有第三方库的类生成源代码

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

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

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

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

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

编译一组类,这些类将作为代码生成的基础 分析二进制文件并生成java源代码
您可以使用Java编译器插件API,即拦截javac编译阶段


为什么需要重新编译反编译的代码?你要换吗?如果是这样的话,为什么不直接更改原始代码呢?如果没有,那么您希望通过反编译和重新编译实现什么?@JosephSible,我不是在重新编译,而是生成另一个源文件更新的描述,希望现在更清楚。您的代码生成是否修改或扩展了代码的API?在生成代码之前,有没有什么东西是不能编译的?这个问题的答案对这个问题的答案影响很大。如果不更改代码的API,则可以在最后生成所有代码。事实上,您可能希望研究AspectJ之类的AOP工具来添加功能,这可能比自己进行所有字节码操作更简单。@ErwinBolwidt,我的代码生成将扩展API,但它不应触及现有类,相反,我需要根据编译的类生成新的源文件。我有一个例子,假设我需要构建一个源文件,其中包含一系列字段,这些字段对应于我要用作基础的类中的每个getter方法。我不能使用源代码,因为Lombok,它稍后会生成getter,但我需要准备一个源文件,列出getter,供开发人员使用生成的文件编写代码。不,这不起作用,我还需要分析编译后的类,从第三方libsSo加载这些并分析。插件是否也处理依赖关系?然后,当我生成新的源文件时,是否可以将它们添加到正在进行的编译中?插件会执行您编写的任何操作。您不需要生成源文件-您可以像Lombok Does那样直接生成类文件。对于我的情况,我实际上需要java源代码,但不需要字节码