天天看點

【Spring注解】java注解淺析

我們IDE程式設計時經常會自動給我們添加Override、Deprecated等以及三方架構注解,這些注解是怎麼定義以及工作的,我們該怎麼自定義注解,這些可能是一個入門程式猿所不了解的,本篇文章将對注解進行簡單的介紹,希望能給一些對注解有困惑的開發一點幫助。

Annotation(注解)就是Java提供了一種元程式中的元素關聯任何資訊和着任何中繼資料(metadata)的途徑和方法,Annotion是一個接口,程式可以通過反射來擷取指定程式元素的Annotion對象,然後通過Annotion對象來擷取注解裡面的中繼資料。

Annotation(注解)是JDK5.0及以後版本引入的。它可以用于建立文檔,跟蹤代碼中的依賴性,甚至執行基本編譯時檢查。從某些方面看,annotation就像修飾符一樣被使用,并應用于包、類 型、構造方法、方法、成員變量、參數、本地變量的聲明中。這些資訊被存儲在Annotation的“name=value”結構對中。

  

  Annotation的成員在Annotation類型中以無參數的方法的形式被聲明。其方法名和傳回值定義了該成員的名字和類型。在此有一個特定的預設文法:允許聲明任何Annotation成員的預設值:一個Annotation可以将name=value對作為沒有定義預設值的Annotation成員的值,當然也可以使用name=value對來覆寫其它成員預設值。這一點有些近似類的繼承特性,父類的構造函數可以作為子類的預設構造函數,但是也可以被子類覆寫。

  Annotation能被用來為某個程式元素(類、方法、成員變量等)關聯任何的資訊。需要注意的是,這裡存在着一個基本的規則:Annotation不能影響程式代碼的執行,無論增加、删除 Annotation,代碼都始終如一的執行。

首先看下我們最長用到的JDK内置注解

Override注解又使用了注解?沒錯,@Target和@Retention是元注解(用于給其注解其他注解,一般自定義注解都要使用).

注解的作用基本有三個:

1、生成文檔。這是最常見的,也是java 最早提供的注解。常用的有 @see @param @return 等

2、跟蹤代碼依賴性,實作替代配置檔案功能。比較常見的是spring 2.5 開始的基于注解配置。作用就是減少配置。現在的架構基本都使用了這種配置來減少配置檔案的數量。也是

3、在編譯時進行格式檢查。如@override 放在方法前,如果你這個方法并不是覆寫了超類方法,則編譯時就能檢查出。

根據注解使用方法和用途,我們可以将annotation分三類:

JDK提供了三個系統注解Override(标記此方法是覆寫了父類的方法)、Deprecated(用于标記方法等過時,一般都會有新的API提供)、SuppressWarnnings(用于通知java編譯器禁止特定的編譯警告)

Java5.0定義了4個标準的meta-annotation類型

① @Target:用于說明Annotation所修飾的範圍,系統代碼如下

ElementType是個枚舉類型,取值有:

CONSTRUCTOR:用于描述構造器

FIELD:用于描述域

LOCAL_VARIABLE:用于描述局部變量

METHOD:用于描述方法

PACKAGE:用于描述包

PARAMETER:用于描述參數

TYPE:用于描述類、接口(包括注解類型) 或enum聲明

② @Retention:定義Annotation被保留的時間長短即注解生命周期限制

RetentionPolicy也是個枚舉類型,取值有:

SOURCE:在源檔案中有效(即源檔案保留,被編譯器丢棄)

CLASS:在class檔案中有效(即class保留,被編譯但虛拟機忽略)

RUNTIME:在運作時有效(即運作時保留,class裝載的時候讀取)

③ @Documented:用于描述其它類型的annotation應該被作為被标注的程式成員的公共API,是以可以被例如javadoc此類的工具文檔化

④ @Inherited:用于标記注解是被繼承的,如果一個使用了@Inherited修飾的annotation類型被用于一個class,則這個annotation将被用于該class的子類

自定義注解一般包含編譯注解和運作時注解,根據系統提供API以及相關機制在編譯或者運作時擷取想要的資料,自定義注解形式和系統注解以及元注解一樣,下文會有自定義注解的Demo。

從上面的元注解來看,注解又分為:

1、标記注解,比如@Override、@Inherited、@Documented。這類注解是沒有元素的,用于标記元素特性比如過時、覆寫父類方法等

2、單值注解,隻有一個元素的注解,比如@Target、@Retention等

3、完整注解 ,除了①和②的所有注解

注解元素定義形式如:

使用形式:

單值注解定義和使用還有簡寫方式:

元素定義:

定義注解和使用注解都很容易,關鍵還是要處理注解,如果沒有處理注解的方法那麼注解就僅僅相當于注釋了。是以建立注解處理器是很重要的,擷取注解之前我們肯定要先擷取注解作用的Target,比如:

Class:類定義

Constructor:構造器定義

Field:類的成員變量

Method:類中的方法

Package:類的包定義

這幾個都是AnnotatedElement接口實作類,運作時注解可以通過java.lang.reflect包下的反射API運作時擷取,含的擷取注解的方法如下:

方法1: T getAnnotation(Class annotationClass): 傳回改程式元素上存在的、指定類型的注解,如果該類型注解不存在,則傳回null。

方法2:Annotation[] getAnnotations():傳回該程式元素上存在的所有注解。

方法3:boolean is AnnotationPresent(Class<?extends Annotation> annotationClass):判斷該程式元素上是否包含指定類型的注解,存在則傳回true,否則傳回false。

方法4:Annotation[] getDeclaredAnnotations():傳回直接存在于此元素上的所有注釋。與此接口中的其他方法不同,該方法将忽略繼承的注釋。(如果沒有注釋直接存在于此元素上,則傳回長度為零的一個數組。)該方法的調用者可以随意修改傳回的數組;這不會對其他調用者傳回的數組産生任何影響。

注解體系思維導圖

【Spring注解】java注解淺析

作者:YYOmomo

連結:https://www.jianshu.com/p/2972782a4ee0

來源:簡書

簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權并注明出處。