编译时注解处理

时间:2021-03-13 03:29:36

标签: java

有没有办法在 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)时,它将返回类型化的值。

1 个答案:

答案 0 :(得分:1)

是的,有,但是,不,它不能更改现有文件。你可以“插入”到编译器中并被告知任何注释;作为其中的一部分,您可以看到签名(因此,字段声明、方法签名、类型等)但没有内容(因此不是用于初始化字段的表达式,也不是方法声明的 {} 中的内容),您可以制作文件,甚至是java文件,但不能编辑现有文件。

Project Lombok 确实编辑了它们,但这是使之成为可能的框架。

您可以使用一些疯狂的技巧。龙目岛项目使用一种技巧(将其反映到编译器内部,从那里修复所有内容,在 IDE 中安装代理和插件)。另一个技巧是使用 java 源文件作为模板。你给你的类命名一些时髦(所以如果你想要,说,public class AppDescriptor,你实际上会制作 java 文件 AppDescriptorTemplate.java 并将 public class AppDescriptorTemplate 放在里面。这个文件的注释和你的一样粘贴。然后,您的注释处理器可以在编译期间 生成 AppDescriptor.java,将所有方法的实现编写为简单的传递(生成 AppDescriptorTemplate 类型的字段,并且ADT 中的所有方法都被复制过来,并且实现都是单行的,只在模板类上调用该方法。模板类可以是包私有的。在这种特定情况下,听起来您几乎可以生成基于不过几乎只有"appName"

Lombok 直接插入构建中,因此几乎完全透明,从某种意义上说,您只需在 IDE 中键入,它生成的方法就会在您键入时显示,而“普通”注释处理器,例如使用 XTemplate 技巧不会那样工作,并且每次都需要构建系统启动。这可能会导致生产力下降。