6

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

Annotation Processing API提供了许多所需的特性(自动服务发现;由 Eclipse 支持)。不幸的是,这是针对代码生成器的,不支持对现有人工制品的操作

该工具的初始输入被认为是由第零轮创建的;因此,尝试创建与这些输入之一对应的源文件或类文件将导致 FilerException。

API 推荐的装饰器模式不是一个选项。

我可以看到如何使用运行时代理/仪器执行该步骤,但这是比手动构建步骤更糟糕的选择,因为它需要任何被 API 接触的人以不明显的方式配置他们的 JVM。

有没有办法插入或包装javac调用的编译器工具?不管文档怎么说,有没有人成功地颠覆了注释处理器来操纵字节码?

4

2 回答 2

4

Groovy 编译器是唯一允许挂钩到编译过程的字节码编译器(例如:生成字节码以支持单例模式

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

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

对于 Eclipse,有一个错误报告可以自动执行此步骤。我不知道这方面的任何其他工作。

于 2008-12-04T12:36:48.637 回答
3

可以办到。

看看我的博客文章Roman Numerals,在我们的 Java中,注释处理器用于重写代码。限制是它仅适用于 Sun 的 javac。

于 2008-12-09T04:58:09.947 回答