【发布时间】:2016-12-22 18:39:48
【问题描述】:
如果我创建一个自定义注解(例如:@SaveFuncName("saveMe") 将添加一个名为 saveMe() 的方法以及我的处理器生成的一些代码),javac 编译器可以使用我的注解处理器向类添加一个方法吗?还是只能创建一个不同的类?
【问题讨论】:
标签: java annotations java-compiler-api
如果我创建一个自定义注解(例如:@SaveFuncName("saveMe") 将添加一个名为 saveMe() 的方法以及我的处理器生成的一些代码),javac 编译器可以使用我的注解处理器向类添加一个方法吗?还是只能创建一个不同的类?
【问题讨论】:
标签: java annotations java-compiler-api
或者我可以只创建一个不同的类吗?
没错。现有的 API 不允许我们修改现有的类,只能生成新的类。
从技术上讲,如果你想做一些 hacky 的东西,可以使用内部 Javac API 直接修改抽象语法树,但这不适合胆小的人。例如,TypeElement 这样的对象实际上是直接来自 Javac 的符号,被接口隐藏起来。语法树也可以通过compiler tree API 以只读模式获得。我们可以抛弃接口并以这种方式修改代码。这就是例如Project Lombok 有效。
(但我不建议这样做。我主要是在解释它,因为 Lombok 是存在的,所以看起来修改类是可能的。)
最简单的解决方案是使用例如生成超类。 saveMe() 方法并扩展它或生成一个实用程序类并委托给它。 (也建议here。)
【讨论】: