McD*_*ell 6 java compiler-construction instrumentation annotations
我有一个后编译步骤来操作生成的类的Java字节码.我想让图书馆消费者尽可能轻松地生活,所以我正在研究如何使这个过程自动化,并且(如果可能的话)编译器不可知.
该注释处理API提供了许多的期望特征(自动服务发现;通过Eclipse的支持).不幸的是,这是针对代码生成器,并不支持对现有工件的操作:
该工具的初始输入被认为是由第0轮创建的; 因此,尝试创建与其中一个输入相对应的源文件或类文件将导致FilerException.
API推荐的Decorator模式不是一个选项.
我可以看到如何使用运行时代理/检测执行该步骤,但这是一个比手动构建步骤更糟糕的选择,因为它需要任何人甚至被API外围触摸以非显而易见的方式配置其JVM.
Groovy 编译器是唯一允许挂钩编译过程的字节码编译器(示例:生成字节码以支持单例模式)
注释处理 API 并不意味着更改代码。正如您已经发现的,您所能做的就是安装一个类加载器,在运行时检查字节码并操作它。这是脑死亡但有效。这遵循了“我们担心开发人员可能会尝试一些愚蠢的事情”这一普遍主题,您将在整个 Java 中发现这一主题。没有办法扩展 javac。相关类要么是私有的、最终的,要么会随着 Java 的下一个版本而改变。
另一种选择是编写带注释的 Java,例如编写一个类“ExampleTpl.java”。然后,您使用预编译器扩展该文件中的注释以获得“Example.java”。在代码的其余部分中,您使用Example
并忽略ExampleTpl
.
对于 Eclipse,有一个错误报告可以自动执行此步骤。我不知道该领域有任何其他工作。