"Sekarang mari kita buat dan gunakan beberapa anotasi."

"Sebagai contoh, katakan kami sedang menulis enjin permainan. Permainan kami mempunyai banyak watak yang termasuk dalam tiga kategori: bunian, pengawal istana dan penjahat."

"Apabila permainan dibangunkan, watak baharu boleh ditambah, dan ini akan mengubah keseimbangan permainan. Oleh itu, adalah sangat mudah untuk memberikan setiap 'kelas watak' anotasinya sendiri yang menerangkan ciri fizikalnya."

"Melakukannya akan menjadikannya sangat mudah untuk mensimulasikan pertempuran antara watak yang berbeza dan/atau mengira baki permainan dengan cepat."

"Saya setuju. Itu idea yang bagus."

"Mari kita buat anotasi @Person yang akan menyimpan kehidupan, kekuatan dan keajaiban, serta parameter serangan dan pertahanan. Begini rupa anotasi itu:"

Contoh
@interface Person
{
 String name() default "";
 int live();
 int strength();
 int magic() default 0;
 int attack() default 0;
 int defense();
}

"Dan, sebagai contoh, inilah rupa perihalan ahli sihir peri hutan:"

Contoh
@Person(live = 100, strength = 10, magic = 5, attack = 20, defense = 20)
class Elf
{
 …
}

"Dan beginilah rupa perihalan penjahat utama:"

Contoh
@Person(live = 1000, strength = 150, magic = 250, attack = 99, defense = 99)
class EvilMaster
{
 …
}

"Saya faham. Ia mengingatkan saya sedikit antara muka penanda."

"Ya. Kecuali, pertama, anda tidak perlu mewarisi apa-apa. Dan kedua, anda boleh menyimpan maklumat tambahan dalam anotasi."

"Terdapat beberapa anotasi yang digunakan untuk menandai anotasi. Ini ialah: "

"Anotasi @Retention menunjukkan tempat anotasi kami akan kelihatan: hanya dalam kod sumber, walaupun selepas penyusunan, atau bahkan pada masa jalankan."

"Anotasi @Target menunjukkan perkara yang boleh ditandakan secara khusus menggunakan anotasi: kelas, medan, kaedah, parameter kaedah, dll."

"Jika kami mahu anotasi kami digunakan pada kelas yang mewarisi kelas beranotasi dan bukan hanya pada kelas beranotasi itu sendiri, maka kami perlu memberi anotasi dengan @Inherited."

"Beginilah rupa anotasi @Person. kami."

Contoh
@Target(value = ElementType.TYPE)
@Retention(value = RetentionPolicy.RUNTIME)
@interface Person
{
 String name() default "";
 int live();
 int strength();
 int magic() default 0;
 int attack() default 0;
 int defence();
}

"Itu sangat menarik, terima kasih, Rishi."

Tetapi bagaimana anda bekerja dengan anotasi ini dalam program? Bagaimana anda menggunakannya? Bagaimana anda membaca nilai mereka?"

"Ini biasanya dilakukan menggunakan Refleksi ."

"Begini cara kami menentukan watak yang lebih kuat:"

Contoh
public boolean fight(Class first, Class second)
{
 if (!first.isAnnotationPresent(Person.class))
  throw new RuntimeException("first param is not game person");
 if (!second.isAnnotationPresent(Person.class))
  throw new RuntimeException("second param is not game person");

 Person firstPerson = (Person) first.getAnnotation(Person.class);
 Person secondPerson = (Person) second.getAnnotation(Person.class);

 int firstAttack = firstPerson.attack() * firstPerson.strength() + firstPerson.magic();
 int firstPower = firstPerson.live() * firstPerson.defence() * firstAttack;

 int secondAttack = secondPerson.attack() * secondPerson.strength() + secondPerson.magic();
 int secondPower = secondPerson.live() * secondPerson.defence() * secondAttack;

 return firstPower > secondPower;
}

"Berikut ialah kaedah yang kami perlukan:"

Kaedah Penerangan
isAnnotationPresent(Annotation.class)
Menyemak sama ada kelas mempunyai anotasi yang ditentukan
getAnnotation(Annotation.class)
Mengembalikan objek anotasi jika kelas mempunyai anotasi yang ditentukan.
Annotation[] getAnnotations()
Mengembalikan tatasusunan semua anotasi kelas

"Bagus. Saya tidak sangka mendapat anotasi semudah itu."

"Uh huh." Cuma panggil kaedah getAnnotation objek, hantarkan jenis anotasi yang dikehendaki."

"Itu sahaja untuk hari ini."

"Terima kasih, Rishi. Ini adalah pelajaran yang sangat menarik. Sekarang saya tidak takut anotasi seperti saya melakukan air."