当前位置: 首页 > 知识库问答 >
问题:

AbstractProcessor,如何声明注释哪个目标是另一个注释?

富涛
2023-03-14

鉴于此注释:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Interceptor {
  Class<? extends Behaviour> value();

}

my library的用户可以扩展其API,创建带有@Interceptor注释的自定义注释,如下所示:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Interceptor(BypassInterceptor.class)
public @interface Bypass {
}

AbstractProcessor提供了一个名为getSupportedAnnotationTypes的方法,该方法返回处理器支持的注释类型的名称。但是如果我指定@Interceptor的名称,如下所示:

 @Override public Set<String> getSupportedAnnotationTypes() {
    Set<String> annotations = new LinkedHashSet();
    annotations.add(Interceptor.class.getCanonicalName());
    return annotations;
  }

当使用@Bypass注释对类进行注释时,不会通知处理器#进程方法。

因此,当使用抽象处理器时,如何声明注释的目标是另一个注释?


共有2个答案

邵飞白
2023-03-14

您应该在处理器上使用@SupportedAnnotationTypes注释,而不要覆盖getSupportedAnnotationTypes()方法,例如:

@SupportedAnnotationTypes({"com.test.Interceptor"})
public class AnnotationProcessor extends AbstractProcessor {
    ...

P-rocessor.get的方法可以根据这个注解的值来构造它的结果,就像AbstractProcessor.get的方法一样。

Javadoc:

https://docs.oracle.com/javase/8/docs/api/javax/annotation/processing/SupportedAnnotationTypes.html

乌甫
2023-03-14

如果注释处理器正在扫描使用注释进行元注释的所有注释,则需要为支持的注释类型指定"*",然后检查每个注释的声明(使用ProcessingEnvironment.getElements()确定它是否具有感兴趣的元注释。

 类似资料:
  • null > (Docs) +javax包因此看起来是未来的证明 -是JEE的一部分,而不是JSE的一部分。在JSE中,需要导入其他库。 -静态分析工具不支持(仅运行时验证) (docs) -外部库,而不是包 -自findbugs版本3.x以来已不推荐使用 +用于静态分析(由findbugs和Sonar使用) (docs) +用于静态分析(在findbugs中) -JSR-305在fb邮件列表中显

  • 我有两个包com.a.b.c和com.x.y.z。在com.a.b2.c中,我定义了这样一个组件: 在com.x.y.z中,我有一个类,我想像这样注入我的ClassA: 我需要做什么样的配置更改才能将我的类注入到我的其他类中?现在我得到了构建错误 org.springframework.beans.factory。NoSuchBeanDefinitionException:未找到依赖项的[com.

  • 我正在使用泽西提议做一个网络服务。 我想做的是一个@Post方法,它通过表单接收3个参数,通过url接收1个参数。 但当我这样做时,我从eclipse得到一个警告:在使用javax的方法中只允许一个未注释的参数。ws。rs.POST注释。当执行时,我得到下一个错误: 消息java。lang.IllegalStateException:当请求实体的内容类型不是application/x-www-fo

  • 我在将包含一些自定义方面的实用程序jar文件导入到另一个项目中遇到了一些困难。需要注意的是,我没有在这个项目中使用Spring,因为我的客户对Spring有些反感。 我已经创建了一个概念验证(下面是完整的代码示例)。当我在utility jar中运行测试运行器时,任何用AspectJ注释注释的方法都可以很好地执行它们的方面。当我在另一个项目中使用相同的jar时,这些方面被忽略了。