当与Java中的超类型引用一起使用时,isAnnotationPresent()返回false

man*_*nta 6 java reflection annotations supertype

我试图使用反射从超类型引用变量获取注释细节,以使该方法接受所有子类型.但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
    }
}
Run Code Online (Sandbox Code Playgroud)

如何获取注释信息?

Jon*_*eet 18

你叫getClass() 一个Class<?>,这将给Class<Class>.现在Class它本身没有注释,这就是为什么你会变得虚假.我想你想要:

// Note no call to o1.getClass()
Class<?> o1 = SomeEntity.class;
System.out.println(o1.isAnnotationPresent(Table.class));
Run Code Online (Sandbox Code Playgroud)

  • 天啊!我怎么能错过这个:(我在重复更改了一些代码,并且在将方法参数从`Object`更改为`Class`之后错过了删除`getClass()`.我知道我的问题是如此愚蠢,因为我做了类似的千万次.感谢你发现我的无知. (2认同)