首页 > 解决方案 > Java Annotation如何获取特定注解的当前ElemenType

问题描述

我的注释:

@Target({ElementType.TYPE, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ObjectName {
    String name() default "";
    String field() default "";
}

一些带有我注释的课程

@ObjectName("a_")
public class A {
    
    @ObjectName("field_")
    String filed;
}

问题 - 当我从上面的类中获取所有“ObjectName”注释时,如何获取注释的 ElementType 值(字段、类或方法类型)?
所以我想要这样的东西

public void process(Class<?> clazz) {
    Annotation[] annotations = clazz.getAnnotations();
    for (Annotation anno : annotations) {
       if (anno instanceof ObjectName) {
          ObjectName annObjName = (ObjectName) anno;
          Target target = anno.getAnnotation(Target.class);
          if (target.getType().equals(ElementType.TYPE)
              doThat(annObjName.name());
          else if (target.getType().equals(ElementType.FIELD)
              doThis(annObjName.field());
       }
    }
}
  1. 我什至可以这样做吗?
  2. 我该怎么做,或者我怎么知道这个注释是否在归档或类上声明?

标签: javaannotations

解决方案


你不能。

您所能做的就是查看您调用的位置getAnnotations(),因为您似乎错误地认为clazz.getAnnotations()它将返回类中所有内容的所有注释。那是错误的。当您调用时clazz.getAnnotations(),您只会直接在类上获取注释。要获取字段注释,您必须调用clazz.getFields(),然后调用getAnnotations()元素Field。因此,只要您保持正确,就没有将它们混淆的风险。


推荐阅读