[英]Compile-time annotation processing
有没有办法在 Java 中进行编译时注释处理?
考虑这个例子:
@Name("appName")
private Field<String> appName;
public void setAppName(String name) {
appName.setValue(name);
}
public String getAppName(String name) {
return appName.getValue();
}
public void someFunction() {
String whatFieldName = appName.getName();
}
其中注解Name
将在编译时处理为Field
设置值,即没有常见的运行时注解处理。 因此,当appName.getName();
( Field
)被访问,它将返回键入的值。
是的,有,但是,不,它不能更改现有文件。 您可以“插入”编译器并获悉任何注释; 作为其中的一部分,您可以看到签名(因此,字段声明、方法签名、类型等)但没有内容(因此不是用于初始化字段的表达式,也不是方法声明的 {} 中的内容),并且您可以制作新文件,甚至是 java 文件,但您不能编辑现有文件。
Project Lombok确实对它们进行了编辑,但这正是使之成为可能的框架。
您可以使用一些疯狂的技巧。 Lombok 项目使用了一个技巧(将其方式反映到编译器内部,从那里修复所有内容,在 IDE 中安装代理和插件)。 另一个技巧是使用 java 源文件作为模板。 You name your class some funky (so if you want, say, public class AppDescriptor
, you'd actually make the java file AppDescriptorTemplate.java
and put public class AppDescriptorTemplate
inside. This file has the annotation precisely as you pasted. Your annotation processor can然后在编译的时候生成AppDescriptor.java
,把所有方法的impls写成简单的pass- AppDescriptorTemplate
(生成一个AppDescriptorTemplate类型的字段,把ADT中的所有方法都复制过来,实现都是单行调用模板类上的那个方法)。模板 class 可以是 package 私有的。在这个特定的场景中,听起来你几乎可以仅基于"appName"
生成整个东西。
Lombok 直接插入构建,因此几乎完全透明,因为您只需键入 IDE,它生成的方法就会在您键入时出现,而使用XTemplate
技巧的“普通”注释处理器不起作用方式并要求构建系统每次都启动。 这可能有点浪费生产力。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.