java基礎(chǔ)之注解(Annotation)

好久沒有寫點(diǎn)什么了~。。。 計(jì)劃記錄一下java的注解和反射以及這兩個(gè)好基友的不可描述,這篇先記錄一下注解(Annotation)
java基礎(chǔ)之反射(Reflect)

注解的基本概念

定義:注解(Annotation),一種代碼級(jí)別的說明。它是JDK1.5及以后版本引入的一個(gè)特性,與類、接口、枚舉是在同一個(gè)層次。它可以聲明在包、類、字段、方法、局部變量、方法參數(shù)等的前面,用來(lái)對(duì)這些元素進(jìn)行說明,注釋。

Annotion(注解)是一個(gè)接口,程序可以通過反射來(lái)獲取指定程序元素的Annotion對(duì)象,然后通過Annotion對(duì)象來(lái)獲取注解里面的元數(shù)據(jù)。

需要注意的是,這里存在著一個(gè)基本的規(guī)則:Annotation不能影響程序代碼的執(zhí)行,無(wú)論增加、刪除 Annotation,代碼都始終如一的執(zhí)行。只有通過某種配套的工具才會(huì)對(duì)annotation類型中的信息進(jìn)行訪問和處理。從而間接影響程序的走向。

注解一般被用來(lái):

  1. 編寫文檔:通過代碼里標(biāo)識(shí)的注解生成文檔
  2. 代碼分析:通過代碼里標(biāo)識(shí)的注解對(duì)代碼進(jìn)行分析
  3. 編譯檢查:通過代碼里標(biāo)識(shí)的注解讓編譯器能夠?qū)崿F(xiàn)基本的編譯檢查

而我們?cè)谌粘i_發(fā)中常用的是上面的第二點(diǎn),自定定義注解并且對(duì)注解進(jìn)行解析。解析的過程一般是發(fā)生在運(yùn)行時(shí)。

內(nèi)置注解

javaSE中內(nèi)置的三個(gè)注解如下,都是熟面孔

@Override:它的作用是對(duì)覆蓋超類中方法的方法進(jìn)行標(biāo)記,如果被標(biāo)記的方法并沒有實(shí)際覆蓋超類中的方法,則編譯器會(huì)發(fā)出錯(cuò)誤警告。

@Deprecated:用于修飾已經(jīng)過時(shí)的方法;

@SuppressWarnings:用于通知java編譯器禁止特定的編譯警告。

其中SuppressWarnings在使用的時(shí)候需要設(shè)置參數(shù)值,比如:

@SuppressWarnings(value={ "rawtypes", "unchecked" })

由于SuppressWarnings annotation類型只定義了一個(gè)單一的成員,所以只有一個(gè)簡(jiǎn)單的value={...}作為name=value對(duì)。又由于成員值是一個(gè)數(shù)組,故使用大括號(hào)來(lái)聲明數(shù)組值。如下:

@SuppressWarnings({ "rawtypes", "unchecked" })  

SuppressWarnings注解的常見參數(shù)值的簡(jiǎn)單說明:

  1. deprecation:使用了不贊成使用的類或方法時(shí)的警告;
  2. unchecked:執(zhí)行了未檢查的轉(zhuǎn)換時(shí)的警告,例如當(dāng)使用集合時(shí)沒有用泛型 (Generics) 來(lái)指定集合保存的類型;
  3. fallthrough:當(dāng) Switch 程序塊直接通往下一種情況而沒有 Break 時(shí)的警告;
  4. path:在類路徑、源文件路徑等中有不存在的路徑時(shí)的警告;
  5. serial:當(dāng)在可序列化的類上缺少 serialVersionUID 定義時(shí)的警告;
  6. finally:任何 finally 子句不能正常完成時(shí)的警告;
  7. all:關(guān)于以上所有情況的警告。

自定義注解

給注解準(zhǔn)備的注解——元注解

元注解的作用就是負(fù)責(zé)注解其他注解。Java5.0定義了4個(gè)標(biāo)準(zhǔn)的meta-annotation類型,它們被用來(lái)提供對(duì)其它 annotation類型作說明。

  1. @Documented —— 指明擁有這個(gè)注解的元素可以被javadoc此類的工具文檔化。這種類型應(yīng)該用于注解那些影響客戶使用帶注釋的元素聲明的類型。如果一種聲明使用Documented進(jìn)行注解,這種類型的注解被作為被標(biāo)注的程序成員的公共API。
  1. @Target——指明該類型的注解可以注解的程序元素的范圍。如果Target元注解沒有出現(xiàn),那么定義的注解可以應(yīng)用于程序的任何元素。
  1. CONSTRUCTOR:用于描述構(gòu)造器
  2. FIELD:用于描述域
  3. LOCAL_VARIABLE:用于描述局部變量
  4. METHOD:用于描述方法
  5. PACKAGE:用于描述包
  6. PARAMETER:用于描述參數(shù)
  7. TYPE:用于描述類、接口(包括注解類型) 或enum聲明
  1. @Inherited——指明該注解類型被自動(dòng)繼承。如果用戶在當(dāng)前類中查詢這個(gè)元注解類型并且當(dāng)前類的聲明中不包含這個(gè)元注解類型,那么也將自動(dòng)查詢當(dāng)前類的父類是否存在Inherited元注解,這個(gè)動(dòng)作將被重復(fù)執(zhí)行知道這個(gè)標(biāo)注類型被找到,或者是查詢到頂層的父類。
  1. @Retention——指明了該Annotation被保留的時(shí)間長(zhǎng)短。
  1. SOURCE:在源文件中有效(即源文件保留)
  2. CLASS:在class文件中有效(即class保留)
  3. RUNTIME:在運(yùn)行時(shí)有效(即運(yùn)行時(shí)保留)

創(chuàng)建自定義注解

定義注解格式:

 public @interface 注解名 {定義體}
  1. 創(chuàng)建自定義注解和創(chuàng)建一個(gè)接口相似,但是注解的interface關(guān)鍵字需要以@符號(hào)開頭。
  2. 在定義注解時(shí),不能繼承其他的注解或接口。
  3. 聲明一個(gè)注解時(shí),其中的每一個(gè)方法實(shí)際上是聲明了一個(gè)配置參數(shù)。方法的名稱就是參數(shù)的名稱,返回值類型就是參數(shù)的類型(返回值類型只能是基本類型、Class、String、enum)??梢酝ㄟ^default來(lái)聲明參數(shù)的默認(rèn)值。
  4. 注解里面的參數(shù)只能用public或默認(rèn)(default)這兩個(gè)訪問權(quán)修飾.例如,String value();這里把方法設(shè)為defaul默認(rèn)類型
  5. 如果自定義注解時(shí)只有一個(gè)參數(shù)成員,最好把參數(shù)名稱設(shè)為"value",后加小括號(hào)例如:String value() default ""; 這樣在使用注解的時(shí)候可以不顯式的指定參數(shù)名稱。例如:@AnnotationName("valueString")

下面給一個(gè)自定義注解的栗子:

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

@Documented
@Target(ElementType.METHOD)
@Inherited
@Retention(RetentionPolicy.RUNTIME)
public @interface TestAnnotation{

     /**
     * 枚舉  狀態(tài)
     */
    public enum Status{ SUCCESS,FAILED,NONE};
    
    /**
     * 顏色屬性
     */
    Status testStatus() default Status.NONE;

    String testString() default 'shli';
    String testDate();
    int testInt() default 1;
 }

學(xué)會(huì)了如何自定義注解,但如果要發(fā)揮注解的作用,則在需要的地方添加自定義注解,并且在適當(dāng)?shù)牡胤綄?duì)注解進(jìn)行處理。
下一篇在記錄java反射機(jī)制的時(shí)候,將介紹對(duì)注解的處理。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 本文章涉及代碼已放到github上annotation-study 1.Annotation為何而來(lái) What:A...
    zlcook閱讀 29,752評(píng)論 15 116
  • 什么是注解(Annotation):Annotation(注解)就是Java提供了一種元程序中的元素關(guān)聯(lián)任何信息和...
    九尾喵的薛定諤閱讀 3,412評(píng)論 0 2
  • 整體Retrofit內(nèi)容如下: 1、Retrofit解析1之前哨站——理解RESTful 2、Retrofit解析...
    隔壁老李頭閱讀 8,812評(píng)論 4 31
  • 提筆瞬間,打開了我不曾發(fā)現(xiàn)的記憶盒子,里面裝滿了我已記不清名字的書籍,閉上眼睛,在另一個(gè)空間,拼命想,拼命看,才模...
    MUMU菌閱讀 309評(píng)論 0 1
  • 1. 差距是問題在你眼里只是負(fù)能量,只是心情不好,但在他眼里卻是問題背后反射出雙方的不足之處,投射出雙方目前所缺少...
    Bradywbs閱讀 197評(píng)論 0 0

友情鏈接更多精彩內(nèi)容