“現在讓我們創建並使用一些註釋。”

“比如,假設我們正在編寫一個遊戲引擎。我們的遊戲有很多角色,分為三類:精靈、宮廷守衛和反派。”

“隨著遊戲的開發,可能會添加新角色,這將改變遊戲平衡。因此,為每個‘角色類別’分配描述其物理特徵的註釋會非常方便。”

“這樣做可以很容易地模擬不同角色之間的戰鬥和/或快速計算遊戲平衡。”

“我同意。這是個好主意。”

“讓我們創建一個@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.annotation的樣子。”

例子
@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。這是一堂非常有趣的課。現在我不再像害怕水一樣害怕註釋了。”