在Java中与超级类型引用一起使用时,isAnnotationPresent()返回false
我试图使用反射从超级类型引用变量获取注释细节,以使该方法接受所有子类型。但是在Java中与超级类型引用一起使用时,isAnnotationPresent()返回false,java,reflection,annotations,supertype,Java,Reflection,Annotations,Supertype,我试图使用反射从超级类型引用变量获取注释细节,以使该方法接受所有子类型。但是isAnnotationPresent()返回false。与其他注释相关的方法相同。如果在精确类型上使用,则输出与预期一致 我知道即使我通过超级类型引用,对象上的注释信息也是可用的 @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE}) public @interface Table { String name(); } @Table(nam
isAnnotationPresent()
返回false
。与其他注释相关的方法相同。如果在精确类型上使用,则输出与预期一致
我知道即使我通过超级类型引用,对象上的注释信息也是可用的
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
public @interface Table {
String name();
}
@Table(name = "some_table")
public class SomeEntity {
public static void main(String[] args) {
System.out.println(SomeEntity.class.isAnnotationPresent(Table.class)); // true
System.out.println(new SomeEntity().getClass().isAnnotationPresent(Table.class)); // true
Class<?> o1 = SomeEntity.class;
System.out.println(o1.getClass().isAnnotationPresent(Table.class)); // false
Class<SomeEntity> o2 = SomeEntity.class;
System.out.println(o2.getClass().isAnnotationPresent(Table.class)); // false
Object o3 = SomeEntity.class;
System.out.println(o3.getClass().isAnnotationPresent(Table.class)); // false
}
}
@Retention(RetentionPolicy.RUNTIME)
@目标({ElementType.TYPE})
公共@接口表{
字符串名();
}
@表格(name=“some_Table”)
公共类实体{
公共静态void main(字符串[]args){
System.out.println(SomeEntity.class.isAnnotationPresent(Table.class));//true
System.out.println(new SomeEntity().getClass().isAnnotationPresent(Table.class));//true
类别o1=SomeEntity.Class;
System.out.println(o1.getClass().isAnnotationPresent(Table.class));//false
类别o2=SomeEntity.Class;
System.out.println(o2.getClass().isAnnotationPresent(Table.class));//false
对象o3=SomeEntity.class;
System.out.println(o3.getClass().isAnnotationPresent(Table.class));//false
}
}
如何获取注释信息?您正在调用
类上的getClass()
,该类将提供类
。现在,Class
本身没有注释,这就是为什么会出现错误。我想你想要:
// Note no call to o1.getClass()
Class<?> o1 = SomeEntity.class;
System.out.println(o1.isAnnotationPresent(Table.class));
//注意没有调用o1.getClass()
类别o1=SomeEntity.Class;
System.out.println(o1.isAnnotationPresent(Table.class));
o1.getClass()
将为您提供类型为java.lang.Class
的对象,该对象没有@Table
注释。我想你想要o1.isAnnotationPresent(Table.class)
在你的代码中,o1
,o2
和o3
已经是类
对象,你想调用isAnnotationPresent(class)
,你不应该在它们上面调用getClass()
,因为在这个阶段,您将在Class
类本身上调用isAnnotationPresent(Class)
,而不是在SomeEntity
类上调用…首先,请参见
其次,正如其他人指出的,您的代码与您的问题有点不同
第三,回答你的问题
我多次遇到类似的需求,因此我编写了一个简短的AnnotationUtil类来完成这项工作和其他类似的工作。Spring框架提供了一个类似的AnnotationUtils类,我想今天的十几个其他包也包含了这段代码,所以您不必重新发明轮子
无论如何,这可能对你有帮助
public static <T extends Annotation> T getAnnotation(Class<?> clazz, Class<T> annotationType) {
T result = clazz.getAnnotation(annotationType);
if (result == null) {
Class<?> superclass = clazz.getSuperclass();
if (superclass != null) {
return getAnnotation(superclass, annotationType);
} else {
return null;
}
} else {
return result;
}
}
publicstatict getAnnotation(类clazz,类annotationType){
T result=clazz.getAnnotation(annotationType);
如果(结果==null){
Class superclass=clazz.getSuperclass();
if(超类!=null){
返回getAnnotation(超类,annotationType);
}否则{
返回null;
}
}否则{
返回结果;
}
}
哦,天哪!我怎么会错过:(我反复更改一些代码,在将方法参数从Object
更改为Class
后,我错过了删除getClass()
。我知道我的问题是如此愚蠢,因为我已经做了无数次类似的事情。谢谢你发现我的无知。@coder先生典型的“滥用复制粘贴”问题…每个人都会陷入这个问题:)@Romain是的,很长一段时间我们都无能为力。使用对象
引用时,是否需要获取注释信息?可能吗?我手术的最后一个病例。Thanks@mrCoder如果您将o3
设置为SomeEntity
的实例,然后调用getClass(),它就会工作。但当你写它的时候,它根本无法工作(至少不是以静态类型很容易允许的方式)。是的,我正在使用类似的方法。但这对我的情况没有帮助,因为我再次调用Class
参数上的getClass()
。感谢java.lang.annotation.Inherited
提示。