Java Academy · Pelajaran

Kebijakan Retensi dan Tipe Target

Pilih retensi SOURCE, CLASS, atau RUNTIME dan batasi elemen target dengan @Target.

Pelajaran 2 dari 413 langkah

Kebijakan Retensi dan Tipe Target adalah pelajaran Java Academy gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Java Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Java Academy mencakup 4 pelajaran total.

Tiga Kebijakan Retensi

SOURCE: dibuang oleh kompilator (hanya berguna untuk APT). CLASS: ditulis ke berkas .class, tetapi tidak tersedia saat waktu proses. RUNTIME: tersedia melalui refleksi. Sebagian besar anotasi kerangka kerja menggunakan RUNTIME.

Retensi SOURCE: Hanya Saat Kompilasi

Anotasi SOURCE diproses oleh pemroses anotasi lalu dibuang. @Override dan @SuppressWarnings adalah SOURCE—keduanya memberi informasi kepada kompilator, tetapi tidak terdapat dalam berkas .class.

@Retention(RetentionPolicy.SOURCE)
public @interface GenerateBuilder {}
// APT generates a Builder class when it sees @GenerateBuilder
// The annotation itself disappears from the compiled output

Retensi CLASS: Analisis Kode Bita

Anotasi CLASS disertakan dalam berkas .class untuk alat analisis kode bita (PMD, FindBugs, ASM), tetapi TIDAK dapat dibaca saat waktu proses melalui refleksi.

@Retention(RetentionPolicy.CLASS)
public @interface ThreadSafe {}
// Visible in bytecode, invisible to Class.getAnnotation() at runtime

Retensi RUNTIME: Pemrosesan Reflektif

Anotasi RUNTIME bertahan hingga waktu proses dan dapat dibaca dengan getAnnotation(). Spring, JUnit, Jackson, dan Hibernate menggunakan retensi 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: Membatasi Titik Penerapan

@Target menggunakan konstanta ElementType untuk membatasi tempat anotasi dapat muncul. Jika diterapkan pada elemen yang tidak diizinkan, kesalahan akan terjadi saat kompilasi.

import static java.lang.annotation.ElementType.*;
@Target({METHOD, CONSTRUCTOR})
@Retention(RetentionPolicy.RUNTIME)
public @interface Measured {}

Semua Nilai ElementType

Daftar lengkap: TYPE (kelas/antarmuka/enum), FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE, ANNOTATION_TYPE, PACKAGE, TYPE_PARAMETER (parameter tipe generik), TYPE_USE (penggunaan tipe apa pun).

// TYPE_USE: annotate any type reference
@NotNull String name;
List<@NonNull String> items;
public @Valid User createUser(@NotNull String name) { ... }

TYPE vs TYPE_USE

TYPE menargetkan deklarasi kelas/antarmuka/enum. TYPE_USE (Java 8+) menargetkan penggunaan tipe apa pun, termasuk generik, konversi tipe, dan klausa extends—sehingga memungkinkan anotasi keamanan terhadap nilai null pada tingkat tipe.

@Target(ElementType.TYPE_USE)
@interface NonNull {}
// Can be applied to:
List<@NonNull String> list;
@NonNull String result = (@NonNull String) obj;

Menggabungkan Target dan Retensi

Sebagian besar anotasi kerangka kerja yang berguna menggabungkan retensi RUNTIME dengan sasaran tertentu. Contohnya, anotasi validasi yang hanya diterapkan pada anggota data.

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Range {
    int min() default 0;
    int max() default Integer.MAX_VALUE;
}

Mewariskan Anotasi dengan @Inherited

@Inherited adalah anotasi meta yang menyebabkan anotasi tingkat kelas diwarisi oleh subkelas. Anotasi ini tidak berpengaruh pada anotasi metode atau anggota data.

@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@interface Framework {}
@Framework class Base {}
class Child extends Base {} // @Framework visible on Child too

@Documented: Penyertaan dalam Javadoc

Terapkan @Documented agar anotasi muncul dalam Javadoc yang dihasilkan untuk elemen beranotasi. Tanpanya, anotasi tidak terlihat dalam dokumentasi API.

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Auditable {
    String description() default "";
}

Membaca Informasi Retensi Saat Waktu Proses

Anda dapat memeriksa retensi dari jenis anotasi itu sendiri menggunakan getAnnotation(Retention.class) pada objek kelas anotasi.

Retention r = Retry.class.getAnnotation(Retention.class);
System.out.println(r.value()); // RUNTIME, CLASS, or SOURCE

Pemeriksaan Singkat

ElementType mana yang mencakup deklarasi kelas, antarmuka, dan enum?

Rangkuman

Gunakan SOURCE untuk alat waktu kompilasi, CLASS untuk analisis kode bita, dan RUNTIME untuk kerangka kerja reflektif. Batasi penggunaan dengan @Target untuk mencegah penyalahgunaan. Tambahkan @Documented untuk anotasi API dan @Inherited untuk anotasi hierarki kelas.

Gratis untuk memulai

Belajar Java dengan tutor AI — gratis

Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.

Kursus
104
Pelajaran
374

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Kebijakan Retensi dan Tipe Target” gratis?

Ya — teks lengkap “Kebijakan Retensi dan Tipe Target” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Java Academy, upgrade ke CoddyKit PRO. Kursus Java Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Kebijakan Retensi dan Tipe Target”?

Pilih retensi SOURCE, CLASS, atau RUNTIME dan batasi elemen target dengan @Target. Kamu berlatih Java Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Java Academy?

Tidak diperlukan pengalaman sebelumnya. Java Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.

Berapa lama pelajaran “Kebijakan Retensi dan Tipe Target” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Java Academy ini?

Ya. Setiap pelajaran Java Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Mendefinisikan Anotasi: Elemen dan Nilai Bawaan
  2. Kebijakan Retensi dan Tipe Target
  3. Pemrosesan Anotasi saat Runtime
  4. Pemroses Anotasi saat Kompilasi
← Kembali ke Java Academy