Java注解如何获取特定注解的当前ElemenType
Java Annotation how to get current ElemenType of specific annotation
我的注释:
@Target({ElementType.TYPE, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ObjectName {
String name() default "";
String field() default "";
}
一些class带有我的注释
@ObjectName("a_")
public class A {
@ObjectName("field_")
String filed;
}
问题 - 当我从上面的 class 获取所有“ObjectName”注释时,如何获取注释的 ElementType 值(字段,class 或方法类型)?
所以我想要这样的东西
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());
}
}
}
- 我能做到吗?
- 我该怎么做,或者我怎样才能知道这个注释是在提交时还是在 class 上声明的?
你不能。
您所能做的就是查看调用 getAnnotations()
的位置,因为您似乎错误地认为 clazz.getAnnotations()
将 return class 中所有内容的所有注释.那是错误的。当你调用 clazz.getAnnotations()
时,你只会得到直接在 class 上的注释。要获取字段上的注释,您必须调用 clazz.getFields()
,然后在 Field
元素上调用 getAnnotations()
。因此,只要您保持直截了当,就不会有混淆它们的风险。
我的注释:
@Target({ElementType.TYPE, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ObjectName {
String name() default "";
String field() default "";
}
一些class带有我的注释
@ObjectName("a_")
public class A {
@ObjectName("field_")
String filed;
}
问题 - 当我从上面的 class 获取所有“ObjectName”注释时,如何获取注释的 ElementType 值(字段,class 或方法类型)?
所以我想要这样的东西
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());
}
}
}
- 我能做到吗?
- 我该怎么做,或者我怎样才能知道这个注释是在提交时还是在 class 上声明的?
你不能。
您所能做的就是查看调用 getAnnotations()
的位置,因为您似乎错误地认为 clazz.getAnnotations()
将 return class 中所有内容的所有注释.那是错误的。当你调用 clazz.getAnnotations()
时,你只会得到直接在 class 上的注释。要获取字段上的注释,您必须调用 clazz.getFields()
,然后在 Field
元素上调用 getAnnotations()
。因此,只要您保持直截了当,就不会有混淆它们的风险。