【发布时间】:2011-04-03 19:16:54
【问题描述】:
考虑以下代码:
A.java:
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
@interface A{}
C.java:
import java.util.*;
@A public class C {
public static void main(String[] args){
System.out.println(Arrays.toString(C.class.getAnnotations()));
}
}
编译和运行按预期工作:
$ javac *.java
$ java -cp . C
[@A()]
然后考虑一下:
$ rm A.class
$ java -cp . C
[]
我预计它会抛出 ClassNotFoundException,因为缺少 @A。但是,它会默默地删除注释。
这种行为是否记录在 JLS 中的某个地方,还是 Sun 的 JVM 的怪癖?这样做的理由是什么?
对于javax.annotation.Nonnull 之类的东西似乎很方便(无论如何,它似乎应该是@Retention(CLASS)),但对于许多其他注释来说,它似乎可能会导致运行时发生各种不好的事情。
【问题讨论】:
标签: java annotations