Annotation#annotationType()有什么用处?

10
接口Annotation指定了一个方法。
Class<? extends Annotation> annotationType()

这个文档1javadoc 没有提供任何信息, 我想知道它有什么用处. 我所能找到的只有这个问题, 但实际上在那里并不需要它(因为下面两个排名靠前的答案已经解决了问题).


它允许我们使用

a.annotationType().equals(MyAnnotation.class)

但是

a instanceof MyAnnotation

a是实现多个注解的类的实例时,执行相同的任务...但有人见过这样的奇怪情况吗?

如果aclass A implements MyAnnotation,YourAnnotation的一个实例,则上述两个测试不等价,但问题是哪个更好...

(*)这就像声明getX()返回x


1
现在有一个JDK-8245620的请求,要求改进文档。 - Marcono1234
JDK-8245620现在被标记为“不修复”JDK 15,但已在JDK 16中修复。 - tom_mai78101
2个回答

13

它类似于getClass(),但由于注解在运行时的实现方式,getClass()常常会返回注解实例的无意义类型。

annotationType()返回"正确的事情"——注解的反射类型,而不是某些无意义的运行时类型。

Enum.getDeclaringClass()相比,后者返回枚举常量的"正确的事情",而myEnumConstant.getClass()可能会返回枚举的合成子类型。


现在我明白了...与Enum的比较有所帮助。如果我想要一个Map<Class<? extends Annotation>, Whatever>,那么就需要“真正”的类。 - maaartinus
是的。例如,我经常传递ClassToInstanceMap<Annotation> - Louis Wasserman

1
使用annotationType()的一个原因是,如果您的注释是使用代理类实现的,则Object.getClass()将返回代理类,而您可能希望返回底层的“真实”实现类。这种情况有多种示例,特别是涉及依赖注入或其他重量级反射时。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接