Java 註解

Java 註解

註解基礎知識點

定義:註解(Annotation),也叫元數據。一種代碼級別的說明。它是JDK1.5及以後版本引入的一個特性,與類、接口、枚舉是在同一個層次。它可以聲明在包、類、欄位、方法、局部變數、方法參數等的前面,用來對這些元素進行說明,注釋。

作用分類:

①編寫文檔:通過代碼里標識的元數據生成文檔【生成文檔doc文檔】

② 代碼分析:通過代碼里標識的元數據對代碼進行分析【使用反射】

③編譯檢查:通過代碼里標識的元數據讓編譯器能夠實現基本的編譯檢查【Override】

基本介紹

  • 中文名:Java 註解
  • 外文名:Annotation
  • 別名:元數據
  • 含義:一種代碼級別的說明
JAVA註解,元數據的作用,元註解,基本內置註解,自定義註解,註解高級套用,使用範圍,註解保持性策略,文檔化功能,標註繼承,讀取方法,

JAVA註解

Annotation(註解)是JDK1.5及以後版本引入的。它可以用於創建文檔,跟蹤代碼中的依賴性,甚至執行基本編譯時檢查。註解是以‘@註解名’在代碼中存在的,根據註解參數的個數,我們可以將註解分為:標記註解、單值註解、完整註解三類。它們都不會直接影響到程式的語義,只是作為註解(標識)存在,我們可以通過反射機制編程實現對這些元數據(用來描述數據的數據)的訪問。另外,你可以在編譯時選擇代碼里的註解是否只存在於原始碼級,或者它也能在class檔案、或者運行時中出現(SOURCE/CLASS/RUNTIME)。

元數據的作用

如果要對於元數據的作用進行分類,還沒有明確的定義,不過我們可以根據它所起的作用,大致可分為三類:
編寫文檔:通過代碼里標識的元數據生成文檔。
代碼分析:通過代碼里標識的元數據對代碼進行分析。
編譯檢查:通過代碼里標識的元數據讓編譯器能實現基本的編譯檢查

元註解

基本內置註解

@Override
它的作用是對覆蓋超類中方法的方法進行標記,如果被標記的方法並沒有實際覆蓋超類中的方法,則編譯器會發出錯誤警告。
Java代碼/** * 測試Override註解 * @author Administrator */public class OverrideDemoTest {    //@Override    public String tostring() {        return "測試註解";    }}
@Deprecated
它的作用是對不應該再使用的方法添加註解,當編程人員使用這些方法時,將會在編譯時顯示提示信息,它與javadoc里的@deprecated標記有相同的功能,準確的說,它還不如javadoc @deprecated,因為它不支持參數,使用@Deprecated的示例代碼示例如下:
Java代碼/** * 測試Deprecated註解 * @author Administrator */public class DeprecatedDemoTest {    public static void main(String[]args) {        // 使用DeprecatedClass里聲明被過時的方法        DeprecatedClass.DeprecatedMethod();    }}class DeprecatedClass {    @Deprecated    public static void DeprecatedMethod() {    }}
@SuppressWarnings
其參數有:
deprecation,使用了過時的類或方法時的警告
unchecked,執行了未檢查的轉換時的警告
fallthrough,當 switch 程式塊直接通往下一種情況而沒有 break 時的警告
path,在類路徑、源檔案路徑等中有不存在的路徑時的警告
serial,當在可序列化的類上缺少serialVersionUID 定義時的警告
finally ,任何 finally 子句不能正常完成時的警告
all,關於以上所有情況的警告
Java代碼import java.util.ArrayList;import java.util.List;public class SuppressWarningsDemoTest {    public static List list = new ArrayList();    @SuppressWarnings("unchecked")    public void add(String data) {        list.add(data);    }}

自定義註解

它類似於新創建一個接口檔案,但為了區分,我們需要將它聲明為@interface,如下例:
Java代碼public @interface NewAnnotation {}
使用自定義的註解類型
Java代碼public class AnnotationTest {    @NewAnnotation    public static void main(String[]args) {    }}
為自定義註解添加變數
Java代碼public @interface NewAnnotation {    String value();}
Java代碼public class AnnotationTest {    @NewAnnotation("mainmethod")    public static void main(String[]args) {        saying();    }        @NewAnnotation(value="saymethod")    public static void saying() {    }}
定義一個枚舉類型,然後將參數設定為該枚舉類型,並賦予默認值
public @interface Greeting {    public enum FontColor {        BLUE,        RED,        GREEN    };    String name();    FontColor fontColor() default FontColor.RED;}
這裡有兩種選擇,其實變數也就是在賦予默認值的參數上,我們可以選擇使用該默認值,也可以重新設定一個值來替換默認值
Java代碼public class AnnotationTest {    @NewAnnotation("mainmethod")    public static void main(String[]args) {        saying();        sayHelloWithDefaultFontColor();        sayHelloWithRedFontColor();    }    @NewAnnotation("saymethod")    public static void saying() {    }        // 此時的fontColor為默認的RED    @Greeting(name="defaultfontcolor")    public static void sayHelloWithDefaultFontColor() {    }    // 將fontColor改為BLUE    @Greeting(name="notdefault", fontColor=Greeting.FontColor.BLUE)    public static void sayHelloWithRedFontColor() {    }}

註解高級套用

使用範圍

用@Target指定ElementType屬性
Java代碼(jdk)public enum ElementType {    // 用於類,接口,枚舉但不能是註解    TYPE,    // 欄位上,包括枚舉值    FIELD,    // 方法,不包括構造方法    METHOD,    // 方法的參數    PARAMETER,    // 構造方法    CONSTRUCTOR,    // 本地變數或catch語句    LOCAL_VARIABLE,    // 註解類型(無數據)    ANNOTATION_TYPE,    // Java包    PACKAGE}
具體例子:
Java代碼// 限制註解使用範圍@Target({ElementType.METHOD,ElementType.CONSTRUCTOR})public @interface Greeting {    // 使用枚舉類型    public enum FontColor {        BLUE,RED,GREEN    };    String name();    FontColor fontColor() default FontColor.RED;}

註解保持性策略

在Java編譯器編譯時,它會識別在原始碼里添加的註解是否還會保留,這就是RetentionPolicy。下面是Java定義的RetentionPolicy枚舉:
編譯器的處理有三種策略:
將註解保留在編譯後的類檔案中,並在第一次載入類時讀取它;
將註解保留在編譯後的類檔案中,但是在運行時忽略它;
按照規定使用註解,但是並不將它保留到編譯後的類檔案中。
Java代碼public enum RetentionPolicy {    // 此類型會被編譯器丟棄    SOURCE,    // 此類型註解會保留在class檔案中,但JVM會忽略它    CLASS,    // 此類型註解會保留在class檔案中,JVM會讀取它    RUNTIME}
Java代碼// 讓保持性策略為運行時態,即將註解編碼到class檔案中,讓虛擬機讀取@Retention(RetentionPolicy.RUNTIME)public @interface Greeting {    // 使用枚舉類型    public enum FontColor {        BLUE,RED,GREEN    };    String name();    FontColor fontColor() default FontColor.RED;}

文檔化功能

Java提供的Documented元註解跟Javadoc的作用是差不多的,其實它存在的好處是開發人員可以定製Javadoc不支持的文檔屬性,並在開發中套用。它的使用跟前兩個也是一樣的,簡單代碼示例如下:
Java代碼// 讓它定製文檔化功能// 使用此註解時必須設定RetentionPolicy為RUNTIME@Documentedpublic @interface Greeting {    // 使用枚舉類型    public enum FontColor {        BLUE,RED,GREEN    };    String name();    FontColor fontColor() default FontColor.RED;}

標註繼承

Java代碼// 讓它允許繼承,可作用到子類@Inheritedpublic @interface Greeting {    // 使用枚舉類型    public enum FontColor {        BLUE,RED,GREEN    };    String name();    FontColor fontColor() default FontColor.RED;}

讀取方法

屬於重點,在系統中用到註解許可權時非常有用,可以精確控制許可權的粒度
注意:要想使用反射去讀取註解,必須將Retention的值選為Runtime
Java代碼import java.lang.annotation.Annotation;import java.lang.reflect.Method;//讀取註解信息public class ReadAnnotationInfoTest {    public static void main(String[] args) throws Exception {        // 測試AnnotationTest類,得到此類的類對象        Class c = Class.forName("com.iwtxokhtd.annotation.AnnotationTest");        // 獲取該類所有聲明的方法        Method[] methods = c.getDeclaredMethods();        // 聲明註解集合        Annotation[] annotations;        // 遍歷所有的方法得到各方法上面的註解信息        for (Method method : methods) {            // 獲取每個方法上面所聲明的所有註解信息            annotations = method.getDeclaredAnnotations();            // 再遍歷所有的註解,列印其基本信息            System.out.println(method.getName());            for (Annotation an : annotations) {                System.out.println("方法名為:" + method.getName() + "其上面的註解為:" + an.annotationType().getSimpleName());                Method[] meths = an.annotationType().getDeclaredMethods();                // 遍歷每個註解的所有變數                for (Method meth : meths) {                    System.out.println("註解的變數名為:" + meth.getName());                }            }        }    }}

相關詞條

熱門詞條

聯絡我們