1. 程式人生 > >Annotation 註解快速入門

Annotation 註解快速入門

face 特征 功能 var 入門 truct 直觀 ram ride

1 、註解的定義

Annontation是Java5開始引入的新特征,中文名稱叫註解。它提供了一種安全的類似註釋的機制,用來將任何的信息或元數據(metadata)與程序元素(類、方法、成員變量等)進行關聯。為程序的元素(類、方法、成員變量)加上更直觀更明了的說明,這些說明信息是與程序的業務邏輯無關,並且供指定的工具或框架使用。Annontation像一種修飾符一樣,應用於包、類型、構造方法、方法、成員變量、參數及本地變量的聲明語句中。


Java註解是附加在代碼中的一些元信息,用於一些工具在編譯、運行時進行解析和使用,起到說明、配置的功能。註解不會也不能影響代碼的實際邏輯,僅僅起到輔助性的作用。包含在 java.lang.annotation 包中。

1.1 元註解

java.lang.annotation提供了四種元註解,專門註解其他的註解(在自定義註解的時候,需要使用到元註解):
@Documented –註解是否將包含在JavaDoc中
@Retention –什麽時候使用該註解
@Target –註解用於什麽地方
@Inherited – 是否允許子類繼承該註解

@Retention– 定義該註解的生命周期

● RetentionPolicy.SOURCE : 在編譯階段丟棄。這些註解在編譯結束之後就不再有任何意義,所以它們不會寫入字節碼。@Override, @SuppressWarnings都屬於這類註解。
● RetentionPolicy.CLASS : 在類加載的時候丟棄。在字節碼文件的處理中有用。註解默認使用這種方式
● RetentionPolicy.RUNTIME : 始終不會丟棄,運行期也保留該註解,因此可以使用反射機制讀取該註解的信息。我們自定義的註解通常使用這種方式。

非常關鍵,默認設置反射是獲取不到的,設置成RUNTIME在運行時可以獲取

Target – 表示該註解用於什麽地方

默認值為任何元素,表示該註解用於什麽地方。可用的ElementType參數包括

● ElementType.CONSTRUCTOR:用於描述構造器
● ElementType.FIELD:成員變量、對象、屬性(包括enum實例)
● ElementType.LOCAL_VARIABLE:用於描述局部變量
● ElementType.METHOD:用於描述方法
● ElementType.PACKAGE:用於描述包
● ElementType.PARAMETER:用於描述參數
● ElementType.TYPE:用於描述類、接口(包括註解類型) 或enum聲明

@Documented–表示是否將註解信息添加在java文檔中

@Inherited – 定義該註釋和子類的關系

@Inherited 元註解是一個標記註解,@Inherited闡述了某個被標註的類型是被繼承的。如果一個使用了@Inherited修飾的annotation類型被用於一個class,則這個annotation將被用於該class的子類。

1.2 內置註解

Deprecated 註解

可以修飾類、方法、變量,在java源碼中被@Deprecated修飾的類、方法、變量等表示不建議使用的,可能會出現錯誤的,可能以後會被刪除的類、方法等,如果現在使用,則在以後使用了這些類、方法的程序在更新新的JDK、jar包等就會出錯,不再提供支持。
個人程序中的類、方法、變量用@Deprecated修飾同樣是不希望自己和別人在以後的時間再次使用此類、方法。當編譯器編譯時遇到了使用@Deprecated修飾的類、方法、變量時會提示相應的警告信息。

Override 註解

指明被註解的方法需要覆寫超類中的方法,如果某個方法使用了該註解,卻沒有覆寫超類中的方法(如大小寫寫錯了,或者參數錯了,或者是子類自己定義的方法),編譯器就會生成一個錯誤。
在子類中重寫父類或接口的方法,@Overide並不是必須的。但是還是建議使用這個註解,在某些情況下,假設你修改了父類的方法的名字,那麽之前重寫的子類方法將不再屬於重寫,如果沒有@Overide,你將不會察覺到這個子類的方法。有了這個註解修飾,編譯器則會提示你這些信息。

Suppresswarnings 註解

@SuppressWarnings用來抑制編譯器生成警告信息,可以修飾的元素為類,方法,方法參數,屬性,局部變量。它可以達到抑制編譯器編譯時產生警告的目的,使用@SuppressWarnings註解,采用就近原則,比如一個方法出現警告,盡量使用@SuppressWarnings註解這個方法,而不是註解方法所在的類。所屬範圍越小越好,因為範圍大了,不利於發現該類下其他方法的警告信息。
但是很不建議使用@SuppressWarnings註解,使用此註解,開發人員看不到編譯時編譯器提示的相應的警告,不能選擇更好、更新的類、方法或者不能編寫更規範的編碼。同時後期更新JDK、jar包等源碼時,使用@SuppressWarnings註解的代碼可能受新的JDK、jar包代碼的支持,出現錯誤,仍然需要修改。

2、 註解的創建

技術分享圖片技術分享圖片

package main.java.com.nf147.annot;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Animal {
    String name() default "";
    String sex() default "公";
    int age() default 0;

    // 1. 創建的語法跟接口非常像
    // 2. 可以通過 default 語句給與默認值
}

3、註解的使用

1. 首先,在需要的地方,添加註解

package com.nf147.ioc;

import com.nf147.annot.Animal;

@Animal(name = "伊麗莎白", sex = "母", age = 1)
public class Dog {
    public void introduce(){
        System.out.println("大家好,我是伊麗莎白");
    }
}

2. 通過反射獲取註解信息

三個重要的方法:

  • isAnnotationPresent()
  • getAnnotation()
  • getAnnotations()
package com.nf147.web;

import com.nf147.annot.Animal;
import com.nf147.ioc.Dog;
import org.junit.Test;

public class DogTest {

    @Test
    public void dogTest(){
        Class dogClass = Dog.class;
        if (dogClass.isAnnotationPresent(Animal.class)) {
            Animal anno = (Animal) dogClass.getAnnotation(Animal.class);
            String name = anno.name();
            String sex = anno.sex();
            int age = anno.age();
            System.out.println("我是"+name+",今年"+age+"歲");
        }

    }

}

技術分享圖片

Annotation 註解快速入門