นโยบายการคงอยู่และชนิดเป้าหมาย
เลือกการคงอยู่แบบ SOURCE, CLASS หรือ RUNTIME และจำกัดองค์ประกอบเป้าหมายด้วย @Target
นโยบายการคงอยู่และชนิดเป้าหมาย เป็นบทเรียน Java Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Java Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน
นโยบายการเก็บรักษาทั้งสามแบบ
SOURCE: คอมไพเลอร์ทิ้งไป (มีประโยชน์เฉพาะกับ APT) CLASS: เขียนลงในไฟล์ .class แต่ไม่พร้อมใช้งานขณะรันไทม์ RUNTIME: พร้อมใช้งานผ่านรีเฟล็กชัน แอนโนเทชันของเฟรมเวิร์กส่วนใหญ่ใช้ RUNTIME
การเก็บรักษาแบบ SOURCE: เฉพาะเวลาคอมไพล์
แอนโนเทชันแบบ SOURCE จะถูกประมวลผลโดยตัวประมวลผลแอนโนเทชันแล้วถูกทิ้งไป @Override และ @SuppressWarnings เป็นแบบ SOURCE ซึ่งให้ข้อมูลแก่คอมไพเลอร์ แต่จะไม่อยู่ในไฟล์ .class
@Retention(RetentionPolicy.SOURCE)
public @interface GenerateBuilder {}
// APT generates a Builder class when it sees @GenerateBuilder
// The annotation itself disappears from the compiled outputการเก็บรักษาแบบ CLASS: การวิเคราะห์ไบต์โค้ด
แอนโนเทชันแบบ CLASS จะรวมอยู่ในไฟล์ .class เพื่อให้เครื่องมือวิเคราะห์ไบต์โค้ด (PMD, FindBugs, ASM) ใช้งาน แต่ไม่สามารถอ่านได้ขณะรันไทม์ผ่านรีเฟล็กชัน
@Retention(RetentionPolicy.CLASS)
public @interface ThreadSafe {}
// Visible in bytecode, invisible to Class.getAnnotation() at runtimeการเก็บรักษาแบบ RUNTIME: การประมวลผลด้วยรีเฟล็กชัน
แอนโนเทชันแบบ RUNTIME จะคงอยู่จนถึงขณะรันไทม์และอ่านได้ด้วย getAnnotation() Spring, JUnit, Jackson และ Hibernate ใช้การเก็บรักษาแบบ RUNTIME
@Retention(RetentionPolicy.RUNTIME)
public @interface Route {
String path();
String method() default "GET";
}
// At runtime:
Route r = handler.getClass().getMethod("handle").getAnnotation(Route.class);
System.out.println(r.path()); // e.g. "/users"@Target: การจำกัดจุดที่นำไปใช้
@Target ใช้ค่าคงที่ของ ElementType เพื่อจำกัดตำแหน่งที่แอนโนเทชันจะปรากฏได้ หากนำไปใช้กับองค์ประกอบที่ไม่อนุญาต จะเกิดข้อผิดพลาดขณะคอมไพล์
import static java.lang.annotation.ElementType.*;
@Target({METHOD, CONSTRUCTOR})
@Retention(RetentionPolicy.RUNTIME)
public @interface Measured {}ค่าทั้งหมดของ ElementType
รายการทั้งหมดมีดังนี้: TYPE (คลาส/อินเทอร์เฟซ/enum), FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE, ANNOTATION_TYPE, PACKAGE, TYPE_PARAMETER (พารามิเตอร์ชนิดทั่วไป), TYPE_USE (การใช้ชนิดใด ๆ)
// TYPE_USE: annotate any type reference
@NotNull String name;
List<@NonNull String> items;
public @Valid User createUser(@NotNull String name) { ... }TYPE กับ TYPE_USE
TYPE ใช้กับการประกาศคลาส/อินเทอร์เฟซ/enum ส่วน TYPE_USE (ตั้งแต่ Java 8 เป็นต้นไป) ใช้กับการอ้างอิงชนิดได้ทุกตำแหน่ง รวมถึงชนิดทั่วไป การแปลงชนิด และส่วนขยายคลาส ทำให้สามารถใช้แอนโนเทชันเพื่อความปลอดภัยจากค่า null ในระดับชนิดได้
@Target(ElementType.TYPE_USE)
@interface NonNull {}
// Can be applied to:
List<@NonNull String> list;
@NonNull String result = (@NonNull String) obj;การใช้ Target และ Retention ร่วมกัน
แอนโนเทชันของเฟรมเวิร์กที่มีประโยชน์ส่วนใหญ่ใช้การเก็บรักษาแบบ RUNTIME ร่วมกับเป้าหมายที่เจาะจง ตัวอย่างเช่น แอนโนเทชันสำหรับตรวจสอบความถูกต้องที่ใช้ได้เฉพาะกับฟิลด์
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Range {
int min() default 0;
int max() default Integer.MAX_VALUE;
}การสืบทอดแอนโนเทชันด้วย @Inherited
@Inherited คือเมทาแอนโนเทชันที่ทำให้แอนโนเทชันระดับคลาสถูกสืบทอดโดยคลาสย่อย แอนโนเทชันนี้ไม่มีผลกับแอนโนเทชันของเมธอดหรือฟิลด์
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@interface Framework {}
@Framework class Base {}
class Child extends Base {} // @Framework visible on Child too@Documented: การรวมไว้ใน Javadoc
ใช้ @Documented เพื่อให้แอนโนเทชันปรากฏใน Javadoc ที่สร้างขึ้นสำหรับองค์ประกอบที่มีแอนโนเทชัน หากไม่มี แอนโนเทชันจะไม่ปรากฏในเอกสารประกอบ API
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Auditable {
String description() default "";
}การอ่านข้อมูล Retention ขณะรันไทม์
คุณสามารถตรวจสอบการเก็บรักษาของชนิดแอนโนเทชันได้โดยใช้ getAnnotation(Retention.class) กับออบเจ็กต์คลาสของแอนโนเทชันนั้น
Retention r = Retry.class.getAnnotation(Retention.class);
System.out.println(r.value()); // RUNTIME, CLASS, or SOURCEตรวจสอบความเข้าใจ
ElementType ใดครอบคลุมการประกาศคลาส อินเทอร์เฟซ และ enum
สรุปทบทวน
ใช้ SOURCE สำหรับเครื่องมือขณะคอมไพล์ ใช้ CLASS สำหรับการวิเคราะห์ไบต์โค้ด และใช้ RUNTIME สำหรับเฟรมเวิร์กที่ทำงานด้วยรีเฟล็กชัน จำกัดการใช้งานด้วย @Target เพื่อป้องกันการใช้ผิดวัตถุประสงค์ เพิ่ม @Documented สำหรับแอนโนเทชันของ API และเพิ่ม @Inherited สำหรับแอนโนเทชันในลำดับชั้นของคลาส
คำถามที่พบบ่อย
บทเรียน “นโยบายการคงอยู่และชนิดเป้าหมาย” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “นโยบายการคงอยู่และชนิดเป้าหมาย” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Java Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “นโยบายการคงอยู่และชนิดเป้าหมาย”
เลือกการคงอยู่แบบ SOURCE, CLASS หรือ RUNTIME และจำกัดองค์ประกอบเป้าหมายด้วย @Target คุณปฏิบัติ Java Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Java Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Java Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “นโยบายการคงอยู่และชนิดเป้าหมาย” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Java Academy นี้ได้ไหม
ได้ บทเรียน Java Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การกำหนดคำอธิบายประกอบ: องค์ประกอบและค่าเริ่มต้น
- นโยบายการคงอยู่และชนิดเป้าหมาย
- การประมวลผลคำอธิบายประกอบขณะทำงาน
- ตัวประมวลผลคำอธิบายประกอบขณะคอมไพล์