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