【发布时间】:2017-01-05 15:20:39
【问题描述】:
我正在尝试创建一个将更改带注释字段的内容的注释。到目前为止,这是我的注释:
@Retention(RetentionPolicy.CLASS)
@Target(ElementType.FIELD)
public @interface MyAnnotation {
String value();
}
我想这样使用它
public class MyClass {
@MyAnnotation("test")
String myField;
}
然后我想在编译时将 myField 的值设置为“test”。我只是不知道如何从注释处理器访问带注释的字段,甚至不知道是否可以在编译时更改其内容。这就是我的注释处理器现在的样子:
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
annotations.stream().flatMap(a -> roundEnv.getElementsAnnotatedWith(a).stream())
.forEach(e -> {
if (!String.class.getName().equals(((VariableElement) e).asType().toString())) {
out.printMessage(Kind.ERROR
, "@MyAnnotation annotation can only be applied to Strings", e);
}
else {
// what to do here?
}
});
return true;
}
我是注释的新手,有点迷茫,因此非常感谢任何想法。
【问题讨论】:
-
您想在编译时设置它吗?我不明白你怎么能做到这一点。当然,您可以在运行时设置它。
-
好的,所以如果不能在编译时完成,我真的不能在注释处理器中完成,对吧?所以我必须使用反射并将保留更改为运行时。
-
好吧,您可以在编译后操作 java 字节码,但是是的,您需要使用反射并将保留更改为运行时。似乎你基本上在寻找的是一个预处理器,就像 C 和 C++ 一样,但 Java 没有。不过,在您的特定查询中,我不确定您比仅分配字符串获得什么好处。
-
谢谢,我想这可以解决问题。我在想这在 C++ 中是多么容易,所以这可能就是为什么我认为它必须在 Java 中以某种方式成为可能......我当然知道在我的例子中我可以将值分配给字符串,但我的下一个步骤本来是希望使用编译器 args 操作注释,但现在我只能在运行时操作该字段。
标签: java annotations annotation-processing