我可以从编译时注释向类添加方法吗?

时间:2016-04-12 04:46:12

标签: java annotations java-compiler-api

如果我创建一个自定义注释(例如:@SaveFuncName("saveMe")将添加一个名为saveMe()的方法,其中包含我的处理器生成的一些代码),javac编译器是否可以使用我的注释处理器向该类添加方法?或者我可以只创建一个不同的类吗?

1 个答案:

答案 0 :(得分:5)

  

或者我可以只创建一个不同的类吗?

那是对的。现有的API不允许我们修改现有的类,只需生成新的类。

从技术上讲,如果你想做一些hacky东西,可以使用内部Javac API直接修改抽象语法树,但它不适合胆小的人。例如,像TypeElement这样的对象实际上是直接来自Javac的符号,由界面隐藏起来。语法树也可通过compiler tree API以只读模式使用。我们可以抛弃接口并以这种方式修改代码。这就是例如Project Lombok有效。

(但我不建议这样做。我主要解释它,因为Lombok是一个存在的东西,所以看起来修改类似乎是可能的。)

最简单的解决方案是执行类似于生成超类的操作。 saveMe()方法并对其进行扩展或生成实用程序类并委托给它。 (还建议here。)