繁体   English   中英

编译时注释处理

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM