一篇博客教会你注解类型判断

本文解释了在Java中,使用Class对象判断注解类型会得到假象,因为实际是JVM创建的代理对象。要获取注解的真实类型,需使用Annotation接口的annotationType()方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

普通类型判断

在 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 接口,所以该方法也是所有注解对象默认拥有的方法。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值