註釋的主要好處不是來自使用 JDK 中已有的標準註釋。同時,很少需要創建自己的註釋。但如果我們正在開發一個大型系統或創建一個單獨的庫,那麼在架構層面,實現我們自己的註釋肯定會產生紅利。

讓我們嘗試創建一個註釋。

為此,創建一個文件,但不是寫classinterface,而是寫@interface。這將是我們註釋的文件。註解的內部結構類似於接口。


public @interface Sum {
   int sum() default 0;
}

@interface表示這是一個註解,
default表示該參數將具有特定的默認值。

噠噠!我們創建了一個註釋!理論上我們已經可以使用它了,但首先配置它會更好。

沒有配置,我們的註釋可以應用於任何東西(類、方法、屬性等),所以此時使用它意義不大。看起來很奇怪,我們的註釋需要用其他註釋進行註釋!

讓我們從@Target開始。

@Target註釋(自 Java 1.5 起相關)限制應用註釋能力。為了將使用限制在某個級別,我們需要將參數傳遞給@Target註釋以指示它可以應用於哪些類型。以下是一些常用的類型:

@Target(ElementType.PACKAGE) 對於包裹
@Target(元素類型.TYPE) 上課
@Target(ElementType.CONSTRUCTOR) 對於構造函數
@Target(元素類型.METHOD) 對於方法
@Target(元素類型.FIELD) 對於類中的屬性(變量)
@Target(元素類型.參數) 對於方法參數
@Target(ElementType.LOCAL_VARIABLE) 對於局部變量

如果您需要多種類型的註解,則可以將多個參數作為數組傳遞:


@Target({ ElementType.PARAMETER, ElementType.LOCAL_VARIABLE })

配置的下一個重要部分是@Retention註釋。

此註釋指示我們的註釋可用的代碼生命週期部分:

保留政策.SOURCE 標有SOURCE保留策略的註解在運行時被丟棄。
保留政策.CLASS 標有CLASS保留策略的註釋被寫入.class文件,但在運行時被刪除。
保留策略.RUNTIME 標有RUNTIME保留策略的註釋在運行時持續存在,並且可以在運行時在我們的程序中訪問。

還有一些註釋可用於配置:

註解 價值
@遺傳 指示派生類繼承父類的註釋實現。
@Documented 這表示註釋將包含在生成的 Javadoc 文檔中。

現在讓我們嘗試創建我們自己的註釋。

我們將為類和方法創建一個註釋,並包含有關代碼作者和版本的信息:


    @Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Info {
   String author() default "Author";
   String version() default "0.0";
}

我們可以將註釋應用於方法和類。我們註釋的元數據將在運行時可用。注意註釋的參數:我們可以提供兩個參數(作者和版本),也可以省略它們。如果我們省略它們,則將使用指定的默認值(默認 "Author"默認 "0.0" )。

值得注意的是,我們不必為參數指定默認值。在這種情況下,該參數成為強制性的。

傳遞參數時,我們必須使用符號value = "value"指定相應的參數。參數必須始終顯式命名,即使註解只有一個參數。

讓我們將註解應用於幾個類:


@Info
public class MyClass1 {
   @Info
   public void myClassMethod() {}
}
 
@Info(version = "2.0")
public class MyClass2 {
   @Info(author = "Anonymous")
   public void myClassMethod() {}
}
 
@Info(author = "Anonymous", version = "2.0")
public class MyClass3 {
   @Info(author = "Anonymous", version = "4.0")
   public void myClassMethod() {}
}