"Saiki ayo nggawe lan nggunakake sawetara anotasi."

"Contone, ayo ngomong kita nulis mesin game. Game kita duwe akeh karakter sing ana ing telung kategori: elf, pengawal istana, lan penjahat."

"Nalika game wis dikembangaké, karakter anyar bisa ditambahake, lan iki bakal ngganti imbangan game. Mangkono, iku bakal trep banget kanggo nemtokake saben 'kelas karakter' anotasi dhewe sing njlèntrèhaké ciri fisik.

"Mengkono bakal gampang banget kanggo simulasi perang antarane karakter beda lan / utawa cepet ngitung imbangan game."

"Aku setuju. Iku ide sing apik."

"Ayo nggawe anotasi @Person sing bakal nyimpen urip, kekuwatan, lan sihir, uga paramèter serangan lan pertahanan. Mangkene carane anotasi katon: "

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

"Lan, minangka conto, iki minangka gambaran babagan penyihir peri alas:"

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

"Lan iki kepiye gambaran saka penjahat utama bakal katon:"

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

"Aku weruh. Iku ngelingaken kula sethitik saka antarmuka panandha."

"Ya. Kajaba, pisanan, sampeyan ora duwe warisan apa-apa. Lan kapindho, sampeyan bisa nyimpen informasi tambahan ing anotasi."

"Ana sawetara anotasi liyane sing digunakake kanggo menehi tandha anotasi. Iki: "

"Anotasi @Retention nuduhake ing ngendi anotasi kita bakal katon: mung ing kode sumber, sanajan sawise kompilasi, utawa malah ing wektu mbukak."

"Anotasi @Target nuduhake apa sing bisa ditandhani kanthi khusus nggunakake anotasi: kelas, kolom, metode, paramèter metode, lsp."

"Yen kita pengin anotasi kita ditrapake ing kelas sing marisi kelas anotasi lan ora mung ing kelas anotasi kasebut, mula kita kudu menehi anotasi karo @Inherited."

"Iki apa @Person kita. anotasi bakal katon kaya."

Tuladha
@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();
}

"Sing menarik banget, matur nuwun, Rishi."

Nanging kepiye sampeyan nggarap anotasi kasebut ing program kasebut? Kepiye carane sampeyan nggunakake? Kepiye carane maca nilai-nilai kasebut?"

"Iki umume rampung nggunakake Refleksi ."

"Iki carane kita nemtokake karakter sing luwih kuwat:"

Tuladha
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;
}

"Iki cara sing dibutuhake:"

Metode Katrangan
isAnnotationPresent(Annotation.class)
Priksa manawa kelas kasebut nduweni anotasi sing ditemtokake
getAnnotation(Annotation.class)
Ngasilake obyek anotasi yen kelas nduweni anotasi sing ditemtokake.
Annotation[] getAnnotations()
Ngasilake larik kabeh anotasi kelas

"Apik. Aku ora nyana yen entuk anotasi bakal dadi prasaja."

"Uh-huh." Cukup nelpon metode getAnnotation obyek, ngliwati jinis anotasi sing dikarepake."

"Iki kanggo dina iki."

"Matur nuwun, Rishi. Iki minangka pelajaran sing menarik banget. Saiki aku ora wedi karo anotasi kaya banyu."