普通类型判断
在 Java 中,我们可以通过判断 Class 对象,从而判断一个对象是某个类型的对象,例如:

我们可以正确得到结果为 true,从而判断 str 对象是一个 String 类型的对象。
注解类型判断
现在我们定义一个注解 TestAnnotation。

然后我们定义一个类,在这个类上使用改注解。

然后我们使用之前判断普通 Java 对象的方法去判断注解对象。

那么我们就会得到一个大大的 false 输出在控制台上!

Why?
Java 中 Class 对象是唯一的,那为什么注解的 Class 对象比较之后却不一致?
我们尝试将两个 Class 对象输出,看看是不是同一个 Class 对象。

输出结果:

从控制台的输出我们可以看到,TestAnnotation.class 对象是一个接口,这是因为 Java 中所有的注解都默认实现了 Annotation 接口。
而另外一个 annotation.getClass() 获取的类对象却是一个从未见过的类,通过名称我们大致可以判断这是一个代理类。
如果我们想要真正获取一个注解对象的类型,那么我们应该使用 Annotation 接口中的 annotationType() 方法来获取接口类型。

控制台输出:

总结
在 Java 中,我们通过 Class 对象获取的注解对象,并不是注解对象本身,而是 JVM 为我们创建的一个代理对象,如果想要获取注解对象真正的 Class 对象,那么就应该使用 Annotation 接口中的 annotationType() 方法来获取真正的注解 Class 对象。
因为所有的注解都默认实现了 Annotation 接口,所以该方法也是所有注解对象默认拥有的方法。
本文解释了在Java中,使用Class对象判断注解类型会得到假象,因为实际是JVM创建的代理对象。要获取注解的真实类型,需使用Annotation接口的annotationType()方法。
4058

被折叠的 条评论
为什么被折叠?



