【问题标题】:annotation processing - how to access (and modify) the contents of a field注释处理 - 如何访问(和修改)字段的内容
【发布时间】: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


【解决方案1】:

这应该很容易使用注释处理,例如https://www.javacodegeeks.com/2015/09/java-annotation-processors.html

【讨论】:

  • 请为任何链接添加上下文,以便您的答案是独立的,这意味着答案需要在答案本身中。见"Provide context for links"。如果您可以在此处用自己的话回答问题并仅作为参考链接,那将是更好的选择。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-13
  • 1970-01-01
  • 2017-11-09
  • 1970-01-01
  • 1970-01-01
  • 2021-06-26
  • 1970-01-01
相关资源
最近更新 更多