Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中与超级类型引用一起使用时,isAnnotationPresent()返回false_Java_Reflection_Annotations_Supertype - Fatal编程技术网

在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
提示。