如何读取类上标注的ElementType.TYPE_USE类型注解@A?
类上TYPE_USE注解的读取异常问题分析
先看这段可正常编译的代码:
@Retention(RetentionPolicy.RUNTIME) @Target({ ElementType.TYPE_USE }) @interface A {} @A final class B {}
这段代码编译完成后,无论是通过反射还是javax.lang.model API读取注解,都会出现异常情况:
具体问题表现
- 反射场景:调用
cls.getAnnotations()会错误地把@A当作类的声明注解返回,但@A的@Target并未包含ElementType.TYPE;而类型注解本应通过AnnotatedType获取,但无法为Class实例获取对应的AnnotatedType。 - javax.lang.model场景:调用
elements.getTypeElement("B").asType().getAnnotationMirrors()会返回空列表,该问题疑似关联JDK-8225377 Bug。
底层原因
查看编译生成的.class文件可以发现,字节码中不存在RuntimeVisibleTypeAnnotations属性,@A被错误写入到RuntimeVisibleAnnotations属性下,被当作类的声明注解处理。相关讨论已在compiler-dev邮件组发起。
内容的提问来源于stack exchange,提问作者Laird Nelson
相关产品推荐
相关产品推荐

