"Sekarang mari kita buat dan gunakan beberapa anotasi."

"Misalnya, katakanlah kita sedang menulis mesin game. Game kita memiliki banyak karakter yang terbagi dalam tiga kategori: elf, penjaga istana, dan penjahat."

"Saat game dikembangkan, karakter baru dapat ditambahkan, dan ini akan mengubah keseimbangan game. Oleh karena itu, akan sangat mudah untuk menetapkan setiap 'kelas karakter' anotasinya sendiri yang menggambarkan karakteristik fisiknya."

"Melakukan hal itu akan sangat memudahkan untuk mensimulasikan pertempuran antara karakter yang berbeda dan/atau dengan cepat menghitung keseimbangan permainan."

"Aku setuju. Itu ide yang bagus."

"Mari kita buat anotasi @Person yang akan menyimpan nyawa, kekuatan, dan sihir, serta parameter serangan dan pertahanan. Begini tampilan anotasinya:"

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

"Dan, sebagai contoh, seperti inilah gambaran dari penyihir peri hutan:"

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

"Dan beginilah deskripsi penjahat utama akan terlihat:"

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

"Begitu. Itu sedikit mengingatkanku pada antarmuka penanda."

"Ya. Kecuali, pertama, Anda tidak perlu mewarisi apa pun. Dan kedua, Anda dapat menyimpan informasi tambahan dalam anotasi."

"Ada beberapa anotasi lagi yang digunakan untuk menandai anotasi. Ini dia: "

"Anotasi @Retention menunjukkan di mana anotasi kita akan terlihat: hanya di kode sumber, bahkan setelah kompilasi, atau bahkan saat dijalankan."

"Anotasi @Target menunjukkan apa yang secara khusus dapat ditandai menggunakan anotasi: kelas, bidang, metode, parameter metode, dll."

"Jika kita ingin anotasi diterapkan ke kelas yang mewarisi kelas beranotasi dan bukan hanya ke kelas beranotasi itu sendiri, maka kita perlu membubuhi keterangan dengan @Inherited."

"Anotasi @Person. kita akan terlihat seperti ini ."

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 cara anda menggunakannya? Bagaimana Anda membaca nilainya?"

"Ini umumnya dilakukan dengan menggunakan Refleksi ."

"Beginilah cara kami menentukan karakter mana 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;
}

"Inilah metode yang kita butuhkan:"

Metode Keterangan
isAnnotationPresent(Annotation.class)
Memeriksa apakah kelas memiliki anotasi yang ditentukan
getAnnotation(Annotation.class)
Mengembalikan objek anotasi jika kelas memiliki anotasi yang ditentukan.
Annotation[] getAnnotations()
Mengembalikan array dari semua anotasi kelas

"Bagus. Saya tidak menyangka mendapatkan anotasi akan sesederhana itu."

"Uh huh." Cukup panggil metode getAnnotation objek, dengan meneruskan jenis anotasi yang diinginkan."

"Cukup untuk hari ini."

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