插入Java编译器

时间:2008-12-04 12:01:38

标签: java compiler-construction annotations instrumentation

我有一个后编译步骤,它操纵生成的类的Java字节码。我想让图书馆消费者尽可能轻松地生活,所以我正在研究如何使这个过程自动化,并且(如果可能的话)编译器不可知。

Annotation Processing API提供了许多所需的功能(自动服务发现; Eclipse支持)。不幸的是,这是针对代码生成器和doesn't support manipulation of existing artefacts

  

该工具的初始输入是   被认为是由第0个人创造的   回合;因此,试图创造   对应的源文件或类文件   其中一个输入将导致   一个FilerException。

API推荐的Decorator模式不是一种选择。

我可以看到如何使用运行时代理/检测执行该步骤,但这是一个比手动构建步骤更糟糕的选择,因为它需要任何人甚至被API外围触摸以非显而易见的方式配置他们的JVM

有没有办法插入或包装compiler tool调用的javac?有没有人成功地破坏了注释处理器来操作字节码,无论文档说什么?

2 个答案:

答案 0 :(得分:4)

Groovy编译器是唯一允许挂钩到编译过程的字节码编译器(例如:Generate bytecode to support the Singleton pattern

注释处理API并不意味着更改代码。正如您已经发现的,您所能做的就是安装一个类加载器,在运行时检查字节码并对其进行操作。这是脑死亡,但它的工作原理。这是一般的“我们害怕开发人员可以尝试一些愚蠢的”主题,你将在整个Java中找到它。没有办法扩展javac。相关的类是私有的,最终的或将随着下一版本的Java而改变。

另一种选择是编写带注释的Java,例如编写一个类“ExampleTpl.java”。然后,使用预编译器扩展该文件中的注释以获得“Example.java”。在其余代码中,您使用Example并忽略ExampleTpl

对于Eclipse,有一个bug report to automate this step。我不知道这方面还有其他工作。

答案 1 :(得分:3)

可以做到。

查看我的博文Roman Numerals, in our Java,其中使用注释处理器重写代码。限制因为它只适用于Sun的javac。