"이제 몇 가지 주석을 만들어 사용하겠습니다."

"예를 들어 게임 엔진을 작성한다고 가정해 보겠습니다. 우리 게임에는 엘프, 궁전 경비병, 악당의 세 가지 범주로 분류되는 많은 캐릭터가 있습니다."

"게임이 개발됨에 따라 새로운 캐릭터가 추가될 수 있으며 이로 인해 게임 밸런스가 변경될 것입니다. 따라서 각 '캐릭터 클래스'에 물리적 특성을 설명하는 고유한 주석을 할당하는 것이 매우 편리할 것입니다."

"그렇게 하면 서로 다른 캐릭터 간의 전투를 매우 쉽게 시뮬레이션하거나 게임 밸런스를 빠르게 계산할 수 있습니다."

"동의합니다. 좋은 생각입니다."

" 생명, 힘, 마법은 물론 공격 및 방어 매개변수를 저장할 @Person 주석을 만들어 보겠습니다 . 주석의 모양은 다음과 같습니다."

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

"그리고 예를 들어 숲의 엘프 마법사에 대한 설명은 다음과 같습니다."

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

"주요 악당에 대한 설명은 다음과 같습니다."

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

"그렇군요. 약간 마커 인터페이스가 생각나네요."

"예. 단, 첫째, 아무것도 상속할 필요가 없습니다. 둘째, 주석에 추가 정보를 저장할 수 있습니다."

"주석을 표시하는 데 사용되는 주석이 몇 가지 더 있습니다 . 다음은 다음과 같습니다. "

"@Retention 주석은 주석이 표시되는 위치를 나타냅니다. 소스 코드에서만, 컴파일 후에도 또는 런타임에도 표시됩니다."

"@Target 주석은 클래스, 필드, 메소드, 메소드 매개변수 등 주석을 사용하여 구체적으로 표시할 수 있는 항목을 나타냅니다."

"주석이 달린 클래스 자체가 아니라 주석이 달린 클래스를 상속하는 클래스에 주석을 적용하려면 @Inherited로 주석을 달아야 합니다."

"이것은 우리의 @Person. 주석이 어떻게 생겼는지입니다."

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

"매우 흥미로웠습니다. 감사합니다, Rishi."

그러나 프로그램에서 이러한 주석으로 작업하는 방법은 무엇입니까? 어떻게 사용합니까? 당신은 그들의 가치를 어떻게 읽습니까?"

"이것은 일반적으로 Reflection 을 사용하여 수행됩니다 ."

"어떤 캐릭터가 더 강한지 결정하는 방법은 다음과 같습니다."

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

"필요한 방법은 다음과 같습니다."

행동 양식 설명
isAnnotationPresent(Annotation.class)
클래스에 지정된 주석이 있는지 확인합니다.
getAnnotation(Annotation.class)
클래스에 지정된 주석이 있는 경우 주석 객체를 반환합니다.
Annotation[] getAnnotations()
모든 클래스 주석의 배열을 반환합니다.

"좋습니다. 주석을 받는 것이 이렇게 간단할 줄은 몰랐습니다."

"어 허." 객체의 getAnnotation 메서드를 호출하여 원하는 주석 유형을 전달하기만 하면 됩니다."

"오늘은 여기까지입니다."

"고맙습니다, Rishi. 이것은 매우 흥미로운 수업이었습니다. 이제 물을 주듯이 주석이 두렵지 않습니다."