java註解

註解:java

從JDK5開始,Java增長對元數據的支持,也就是註解,註解與註釋是有必定區別的,能夠把註解理解爲代碼裏的特殊標記,這些標記能夠在編譯,類加載,運行時被讀取,並執行相應的處理。經過註解開發人員能夠在不改變原有代碼和邏輯的狀況下在源代碼中嵌入補充信息。SSM項目中存在各類註解,由於後續會手寫這幾個框架,全部須要先打好基礎,將這幾個框架中要用到的知識點都去學習學習。數組

註解的定義:框架

註解經過@interface關鍵字定義的學習

 

public @interface LogAnnotation { String logValue() default "--"; }

 

註解的應用spa

上面建立了註解,那麼註解的使用code

 

@LogAnnotation public class Test { }

 

元註解:orm

元註解標籤有 @Retention、@Documented、@Target、@Inherited、@Repeatable 5 種。blog

@Retention

Retention 的英文意爲保留期的意思。當 @Retention 應用到一個註解上的時候,它解釋說明了這個註解的的存活時間。繼承

它的取值以下:接口

RetentionPolicy.java

package java.lang.annotation; public enum RetentionPolicy { SOURCE, /* Annotation信息僅存在於編譯器處理期間,編譯器處理完以後就沒有該Annotation信息了 */ CLASS, /* 編譯器將Annotation存儲於類對應的.class文件中。默認行爲 */ RUNTIME /* 編譯器將Annotation存儲於class文件中,而且可由JVM讀入 */ }

 

 

 

 

@Retention(RetentionPolicy.RUNTIME) public @interface LogAnnotation { String logValue() default "--"; }

@Documented

顧名思義,這個元註解確定是和文檔有關。它的做用是可以將註解中的元素包含到 Javadoc 中去。

@Target

ElementType.java
package java.lang.annotation; public enum ElementType { TYPE, /* 類、接口(包括註釋類型)或枚舉聲明 */ FIELD, /* 字段聲明(包括枚舉常量) */ METHOD, /* 方法聲明 */ PARAMETER, /* 參數聲明 */ CONSTRUCTOR, /* 構造方法聲明 */ LOCAL_VARIABLE, /* 局部變量聲明 */ ANNOTATION_TYPE, /* 註釋類型聲明 */ PACKAGE /* 包聲明 */ }

@Inherited

Inherited 是繼承的意思,可是它並非說註解自己能夠繼承,而是說若是一個超類被 @Inherited 註解過的註解進行註解的話,那麼若是它的子類沒有被任何註解應用的話,那麼這個子類就繼承了超類的註解。

@Repeatable

Repeatable 天然是可重複的意思。@Repeatable 是 Java 1.8 才加進來的,因此算是一個新的特性。

什麼樣的註解會屢次應用呢?一般是註解的值能夠同時取多個。

註解的屬性

註解的屬性也叫作成員變量。註解只有成員變量,沒有方法。註解的成員變量在註解的定義中以「無形參的方法」形式來聲明,其方法名定義了該成員變量的名字,其返回值定義了該成員變量的類型。

import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /**  Annotation類型裏面的參數該怎麼設定:   第一,只能用public或默認(default)這兩個訪問權修飾.例如,String value();這裏把方法設爲default默認類型;      第二,參數成員只能用基本類型byte,short,char,int,long,float,double,boolean 八種基本數據類型和 String,Enum,Class,annotations等數據類型,以及這一些類型的數組. 例如: String value();這裏的參數成員就爲String;  */ @Target({ElementType.TYPE, ElementType.METHOD, ElementType.PACKAGE, ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) public @interface LogAnnotation { /** logValue表示調用LogAnnotation傳遞的參數名稱爲logValue, String表示傳遞的參數值爲字符串 如: @LogAnnotation(logValue = "aaa") */ String logValue() default "--"; // Integer time(); 錯誤不能用包裝數據類型
    public String time(); // public 能夠省略, 由於默認是public權限
}

上面代碼定義了 @LogAnnotation 這個註解中擁有 logValue 和 time 兩個屬性。在使用的時候,咱們應該給它們進行賦值。

賦值的方式是在註解的括號內以 value="" 形式,多個屬性以前用 ,隔開。

@LogAnnotation(logValue = "進入Animal類", time = "2019-11-08") public class Animal { @LogAnnotation(logValue = "調用name字段", time = "2019-01-01") public static final String name = "張三"; public static final Integer age = 19; @LogAnnotation(logValue = "調用sex字段", time = "2019-01-01") public static final String sex = "男"; @LogAnnotation(logValue = "調用eat方法", time = "2019-11-09") public void eat() { System.out.println("動物在吃飯"); } @LogAnnotation(logValue = "調用sleep方法", time = "2019-11-10") public void sleep() { System.out.println("動物在睡覺"); } public void play() { System.out.println("動物在玩"); } }

須要注意的是,使用@interface自定義註解時,自動繼承了java.lang.annotation.Annotation接口,由編譯程序自動完成其餘細節。在定義註解時,不能繼承其餘的註解或接口。@interface用來聲明一個注

解,其中的每個方法其實是聲明瞭一個屬性。方法的名稱就是屬性的名稱,返回值類型就是參數的類型(返回值類型只能是8 種基本數據類型、Class、String、enum及它們的數組)。

定義註解格式:

  public @interface 註解名 {定義體}

  註解參數的可支持數據類型:

    1.全部基本數據類型(int,float,boolean,byte,double,char,long,short)

    2.String類型

    3.Class類型

    4.enum類型

    5.Annotation類型

    6.以上全部類型的數組

private static void med3() throws NoSuchMethodException { Field[] declaredFields = Animal.class.getDeclaredFields(); for (Field field : declaredFields) { LogAnnotation annotation = field.getAnnotation(LogAnnotation.class); if (annotation == null) { continue; } String logValue = annotation.logValue(); String time = annotation.time(); System.out.println(String.format("logValue=%s, time=%s", logValue, time)); } }

結果:

logValue=調用name字段, time=2019-01-01 logValue=調用sex字段, time=2019-01-01
相關文章
相關標籤/搜索