次のコードを検討してください。
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)
とにかくそうであるはずだったように)のようなものには便利なようですが、他の多くの注釈では、実行時にさまざまな悪いことが発生する可能性があるようです。