分类: Java开发

关于 java.lang.ArrayStoreException: sun.reflect.annotation.TypeNotPresentExceptionProxy

Java SE5扩展了反射机制的API,Class 中出现了 getAnnotation(Class<a> annotationClass) 方法,该方法可以帮助程序员快速的构造自定义注解处理器。文档中对该方法的注释为:

返回改程序元素上存在的、指定类型的注解,如果该类型注解不存在,则返回null。

但是当框架在处理不严谨的情况下就会导致某些奇怪的 bug,假设

框架定义了注解 AnnotationA,注解处理器扫描到具体类 ClassA,ClassA 上不存在 AnnotationA 注解,但存在 classpath 之外的注解 AnnotationB

在这种情况下 ClassA.getAnnotation(AnnotationA.class) 并不会返回 null,而是由于注解 B 加载失败导致了异常:

Exception in thread "main" java.lang.ArrayStoreException: sun.reflect.annotation.TypeNotPresentExceptionProxy
at sun.reflect.annotation.AnnotationParser.parseClassArray(AnnotationParser.java:677)
at sun.reflect.annotation.AnnotationParser.parseArray(AnnotationParser.java:484)
at sun.reflect.annotation.AnnotationParser.parseMemberValue(AnnotationParser.java:308)
at sun.reflect.annotation.AnnotationParser.parseAnnotation(AnnotationParser.java:242)
at sun.reflect.annotation.AnnotationParser.parseAnnotations2(AnnotationParser.java:88)
at sun.reflect.annotation.AnnotationParser.parseAnnotations(AnnotationParser.java:70)
at java.lang.Class.initAnnotationsIfNecessary(Class.java:3093)
at java.lang.Class.getAnnotation(Class.java:3052)
at AnnotationTest.doTest(AnnotationTest.java:9)
at AnnotationTest.main(AnnotationTest.java:5)

这理应属于 jdk 的一个 bug,出了一个文档中没解释的异常,但由于 jdk 默认不修复,就只能要求各注解处理器酌情处理了。

参考链接:http://bugs.java.com/view_bug.do?bug_id=7183985

Recent Posts

Docker 容器非 root 用户监听 80 端口

起因是基于 CentOS 的 …

2 年 之前

基于 Docker 定时打印文件

先说背景,喷墨打印机有个很大的…

3 年 之前

Java 运行时反射获取来自继承的泛型

背景 正常情况下 Java 的…

3 年 之前

Java 基于 ByteBuddy 重写系统当前时间

背景 一般单元测试时总会有些代…

3 年 之前

华硕 B450F-Gaming 主板 I211-AT 网卡驱动安装

事情起因是买了块华硕的 ROG…

3 年 之前

PHP 安装 Memcached 扩展

登录服务器挨步执行: # su…

4 年 之前