三分鐘搞懂:Java自定義註解及使用

一、註解是什麼?

Java註解是附加在程式碼中的一些元資訊 ,簡單來說,註解就算一個輔助工具,可以讓我們的程式碼更加簡潔等。

二、為什麼要學習註解?

首先,我們平時使用的框架,就是靠著註解才得以使我們開發更加方便。

框架=註解+反射+設計模式

透過註解你可以將你的某個方法以註解的形式呼叫,就像Spring中的@Controller、@Component等註解一樣。

首先說明一個概念:

什麼是元註解?元註解就是對現有註解進行說明的註解,是jdk定義好的。

為此,我們接下來來了解一下JDK5。0提供的四個元註解:

@Retention:指定所修飾的 Annotation 的生命週期。引數:

RetrntionPolicy。SOURCE—註解只在原始檔中有效

RetrntionPolicy。CLASS—註解在class檔案中有效,當執行Java程式時,該註解不會被保留。預設值。

RetrntionPolicy。RUNTIME—執行時有效。程式可以透過反射來獲取該註解。

@Target:用於指定被修飾的 註解能用於修飾哪些程式元素

@Documented:表示所修飾的註解在被javadoc解析時,保留下來。

@Inherited:被它修飾的註解將具繼承性。

三、怎麼使用註解

瞭解了上面的概念後,我們可以來實現一個簡單的註解,程式碼如下:

@Retention(RetentionPolicy。RUNTIME) // 註解在執行時有效,即可透過反射獲取 @Target({ElementType。METHOD,ElementType。PARAMETER})  // 註解可用在方法和引數上。 @Inherited // 註解可繼承 @Documented // javadoc解析時保留 @interface HelloAnnotation {     String value() default “hello”; }  @HelloAnnotation public void setAge() {     /*……*/ }

註解只是提供一個輔助資訊,要跟反射結合在一起使用才可以實現某項功能!

四、補充知識:Java8中註解的新特性

可重複註解:(當需要在一個方法上使用多次註解時使用)

① 在HelloAnnotation上宣告@Repeatable,成員值為HelloAnnotations。class

② HelloAnnotation的Target和Retention等元註解與HelloAnnotations相同。

程式碼示例如下:

@Retention(RetentionPolicy。RUNTIME) // 註解在執行時有效,即可透過反射獲取 @Target(ElementType。METHOD) // 註解可用在方法上 @Inherited // 註解可繼承 @Repeatable(HelloAnnotations。class)//可重複 @Documented // javadoc解析時保留 @interface HelloAnnotation {     String value() default “hello”; } @Retention(RetentionPolicy。RUNTIME) // 註解在執行時有效,即可透過反射獲取 @Target(ElementType。METHOD) // 註解可用在方法上 @Inherited // 註解可繼承 @Documented // javadoc解析時保留 @interface HelloAnnotations {     HelloAnnotation value()[]; }  //使用如下: @HelloAnnotation @HelloAnnotation public static void main(String[] args) { }

型別註解:

①ElementType。TYPE_PARAMETER 表示該註解能寫在型別變數的宣告語句中,如:泛型宣告。

示例程式碼如下:

@Retention(RetentionPolicy。RUNTIME) // 註解在執行時有效,即可透過反射獲取 @Target({ElementType。TYPE_PARAMETER }) // 註解可用在方法上 @interface HelloAnnotation {     String value() default “hello”; }  class TestAnnotation<@HelloAnnotation T> {  }

②ElementType。TYPE_USE 表示該註解能寫在使用型別的任何語句中。

示例程式碼如下:

@Retention(RetentionPolicy。RUNTIME) // 註解在執行時有效,即可透過反射獲取 @Target({ElementType。TYPE_USE}) // 註解可用在方法上 @interface HelloAnnotation {     String value() default “hello”; }  public static void main(String[] args) throws @HelloAnnotation RuntimeException{         @HelloAnnotation int i = 0;         List<@HelloAnnotation String> list = null; }