编译时注释处理

  • 本文关键字:处理 注释 编译 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(时,它将返回类型化的值。

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

Lombok项目确实对它们进行了编辑,但这正是实现这一目标的框架。

你可以用一些疯狂的把戏。lombok项目使用了一个技巧(将其反映到编译器内部,从那里修复所有内容,在IDE中安装代理和插件(。另一个技巧是使用java源文件作为模板。你给你的类命名得有点古怪(所以,如果你想要public class AppDescriptor,你实际上会制作java文件AppDescriptorTemplate.java,并把public class AppDescriptorTemplate放在里面。这个文件的注释和你粘贴的一模一样。然后,在编译过程中,你的注释处理器可以生成AppDescriptor.java,把所有方法的impl写成简单的pass-through(生成一个类型为AppDescriptorTemplate的字段,并复制ADT中的所有方法,并且实现都是只在模板类上调用该方法的一行代码(。模板类可以是包专用的。在这个特定的场景中,听起来你几乎可以只基于"appName"生成整个东西。

Lombok直接插入到构建中,因此实际上是完全透明的,因为你只需在IDE中键入,它生成的方法就会在键入时出现,而使用XTemplate技巧的"普通"注释处理器则不会以这种方式工作,每次都需要构建系统启动。这可能有点消耗生产力。

最新更新