我正在编写一个方法,该方法应该检索特定方法声明类及其超类的所有注释。
通过在声明类上使用getAnnotations()
方法,结果表只包含声明类注释,而忽略超类注释。如果我删除了声明类的注释,那么超类的注释就存在了。
我在这里错过了什么?
检索注释的简化方法:
public void check(Method invokedMethod) {
for (Annotation annotation : invokedMethod.getDeclaringClass().getAnnotations()) {
// Do something ...
}
}
(所有的注释,我试图得到有@Inherited
注释)
如果您需要处理多个相同类型的注释,则标准方法不起作用,因为注释存储在以注释类型为键的Map
中。(点击这里查看更多信息)。下面是我将如何解决这个问题(只需手动遍历所有超类):
import java.lang.annotation.Annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Method;
public class AnnotationReflectionTest {
public static void main(String[] args) throws Exception {
check(Class2.class.getMethod("num", new Class[0]));
}
public static void check(Method invokedMethod) {
Class<?> type = invokedMethod.getDeclaringClass();
while (type != null) {
for (Annotation annotation : type.getDeclaredAnnotations()) {
System.out.println(annotation.toString());
}
type = type.getSuperclass();
}
}
}
@Inherited
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@interface Annot1 {
int num();
}
@Annot1(num = 5)
class Class1 {
public int num() {
return 1;
}
}
@Inherited
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@interface Annot2 {
String text();
}
@Annot2(text = "ttt")
class Class2 extends Class1 {
public int num() {
return super.num() + 1;
}
}
你用的是什么版本的Java和什么操作系统?
我必须用
写一个简单的方法private <A extends Annotation> A getAnnotationFromType(Class<?> classType, final Class<A> annotationClass) {
while ( !classType.getName().equals(Object.class.getName()) ) {
if ( classType.isAnnotationPresent(annotationClass)) {
return classType.getAnnotation(annotationClass);
}
classType = classType.getSuperclass();
}
return null;
}
这对大多数人来说可能是显而易见的,但是如果您来这里寻找类及其超类的字段,您可以使用
myClass.getFields()
获取所有字段,包括超类的字段,而不是
myClass.getDeclaredFields()
,它只返回类本身的字段。方法和构造函数也类似。