พิจารณารหัสต่อไปนี้:
อ. จาวา:
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
@interface A{}
ค. 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 ที่ไหนสักแห่งหรือเป็นมุมมองของ JVM ของ Sun? เหตุผลของมันคืออะไร?
ดูเหมือนว่าจะสะดวกสำหรับสิ่งต่างๆเช่นjavax.annotation.Nonnull
(ซึ่งดูเหมือนว่ามันควรจะเป็นเช่นนั้น@Retention(CLASS)
) แต่สำหรับคำอธิบายประกอบอื่น ๆ ดูเหมือนว่ามันอาจทำให้เกิดสิ่งเลวร้ายต่างๆที่รันไทม์ได้