0Pricing
Java Academy · บทเรียน

นโยบายการคงอยู่และชนิดเป้าหมาย

เลือกการคงอยู่แบบ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การกำหนดคำอธิบายประกอบ: องค์ประกอบและค่าเริ่มต้น
  2. นโยบายการคงอยู่และชนิดเป้าหมาย
  3. การประมวลผลคำอธิบายประกอบขณะทำงาน
  4. ตัวประมวลผลคำอธิบายประกอบขณะคอมไพล์
← กลับไปที่ Java Academy