溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何看待java注解

發(fā)布時間:2021-10-19 16:59:50 來源:億速云 閱讀:137 作者:柒染 欄目:大數(shù)據(jù)

這篇文章將為大家詳細(xì)講解有關(guān)如何看待java注解,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。

什么是注解?

用一個詞就可以描述注解,那就是元數(shù)據(jù),即一種描述數(shù)據(jù)的數(shù)據(jù)。所以,可以說注解就是源代碼的元數(shù)據(jù)。

@Override

public String toString() {

    return "This is String Representation of current object.";

}

@Override告訴編譯器這個方法是一個重寫方法(描述方法的元數(shù)據(jù))

為什么要引入注解?

使用Annotation之前(甚至在使用之后),XML被廣泛的應(yīng)用于描述元數(shù)據(jù)。

但是廣泛xml后,開發(fā)人員發(fā)現(xiàn)XML的維護(hù)越來越困難了。

他們希望有一個和代碼緊耦合的東西來做代碼描述,而不是全部使用XML這種和代碼松耦合的描述。

那么問題來了,什么時候使用注解,什么時候使用xml?

我們再來回顧一下上面兩種配置方式的特點(diǎn):

  • 對于注解的方式。我們會發(fā)現(xiàn)它和代碼結(jié)合得很緊密,所以注解比較適合做一些與代碼相關(guān)度高的操作,例如將Bean對應(yīng)的服務(wù)暴露出去。

  • 對于XML配置方式。我們會發(fā)現(xiàn)它將配置和代碼隔離開來了所以XML配置更適合做一些全局的、與具體代碼無關(guān)的操作,例如全局的配置等。

我相信很多人此前對于注解的認(rèn)識就是方便開發(fā)。但事實(shí)上使用注解還是XML的判斷標(biāo)準(zhǔn)應(yīng)該是:該配置與代碼的相關(guān)度。如果代碼與配置相關(guān)度高,那么使用注解配置,否則使用XML配置。

注解的作用

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

跟蹤代碼依賴性,實(shí)現(xiàn)替代配置文件功能。比較常見的是spring 2.5 開始的基于注解配置。作用就是減少配置?,F(xiàn)在的框架基本都使用了這種配置來減少配置文件的數(shù)量。

在編譯時進(jìn)行格式檢查。如@Override 放在方法前,如果你這個方法并不是覆蓋了超類方法,則編譯時就能檢查出。

注解在目前而言最主流的應(yīng)用:代替配置文件

注解的優(yōu)缺點(diǎn)

注解優(yōu)點(diǎn):開發(fā)效率高 成本低 

注解缺點(diǎn):耦合性大 并且不利于后期維護(hù)

注解是如何生成并使用的?

第一步:自定義注解

第二步:使用注解

第三步:解析注解

Annotations僅僅是元數(shù)據(jù),和業(yè)務(wù)邏輯無關(guān)。

如果Annotations不包含業(yè)務(wù)邏輯,那么必須有人來實(shí)現(xiàn)這些邏輯。元數(shù)據(jù)的"使用者"來做這個事情。Annotations僅僅提供它定義的屬性(類/方法/包/域)的信息。Annotations的"使用者"來讀取這些信息并實(shí)現(xiàn)必要的邏輯。當(dāng)我們使用框架提供的注解時,框架中的某個組件會負(fù)責(zé)做讀取后的邏輯處理。

框架一般都幫我們實(shí)現(xiàn)了第一步自定義注解,和第三步解析注解,我們?nèi)粘i_發(fā)過程中用到的基本都是第二步,使用注解。

自定義注解

一個注解大致可以分為三個部分:注解體、元注解、注解屬性

注解體指定了注解的名字

元注解標(biāo)記了該注解的使用場景、留存時間等信息

而注解屬性則指明該注解擁有的屬性。

如何看待java注解

注解體

注解體是最簡單的一個組成部分,只需要實(shí)例中一樣有樣學(xué)樣即可。與接口的聲明唯一的不同是在 interface 關(guān)鍵字前多了一個 @ 符號。

//聲明了一個名為sweet的注解體

@Retention(RetentionPolicy.RUNTIME)

public @interface sweet{

}

元注解

元注解(meta-annotation)本身也是一個注解,用來標(biāo)記普通注解的存留時間、使用場景、繼承屬性、文檔生成信息。

元注解是一個特殊的注解,它是 Java 源碼中就自帶的注解。在Java 中只有四個元注解,它們分別是:@Target、@Retention、@Documented、@Inherited。

@Target注解

Target 注解限定了該注解的使用場景。

它有下面這些取值:

  • ElementType.ANNOTATION_TYPE 可以給一個注解進(jìn)行注解

  • ElementType.CONSTRUCTOR 可以給構(gòu)造方法進(jìn)行注解

  • ElementType.FIELD 可以給屬性進(jìn)行注解

  • ElementType.LOCAL_VARIABLE 可以給局部變量進(jìn)行注解

  • ElementType.METHOD 可以給方法進(jìn)行注解

  • ElementType.PACKAGE 可以給一個包進(jìn)行注解

  • ElementType.PARAMETER 可以給一個方法內(nèi)的參數(shù)進(jìn)行注解

  • ElementType.TYPE 可以給一個類型進(jìn)行注解,比如類、接口、枚舉

@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE})

public @interface Autowired {

        boolean required() default true;

}

在上面 Autowire的 注解中,其 Target 注解的值為 CONSTRUCTOR、METHOD、PARAMETER、FIELD、ANNOTATION_TYPE 這 5 個值。這表示 Autowired 注解只能在構(gòu)造方法、方法、方法形參、屬性、類型這 5 種場景下使用。

@Retention注解

Retention 注解用來標(biāo)記這個注解的留存時間。

它其有四個可選值:

  • RetentionPolicy.SOURCE。注解只在源碼階段保留,在編譯器進(jìn)行編譯時它將被丟棄忽視。

  • RetentionPolicy.CLASS。注解只被保留到編譯進(jìn)行的時候,它并不會被加載到 JVM 中。

  • RetentionPolicy.RUNTIME。注解可以保留到程序運(yùn)行的時候,它會被加載進(jìn)入到 JVM 中,所以在程序運(yùn)行時可以獲取到它們。

@Retention(RetentionPolicy.RUNTIME) public @interface Autowired { boolean required() default true; }

在上面 Autowire的 注解中,其 Retention 注解的值為 RetentionPolicy.RUNTIME,說明該注解會保留到程序運(yùn)行的時候。

@Documented

@ Documented 注解表示將注解信息寫入到 javadoc 文檔中。

在默認(rèn)情況下,我們的注解信息是不會寫入到 Javadoc 文檔中的。但如果該注解有 @Documented 標(biāo)識,那么該注解信息則會寫入到 javadoc 文檔中。

@Inherited

@ Inherited注解標(biāo)識子類將繼承父類的注解屬性。

在下面的例子中,我們聲明了一個 Sweet 注解,接著在 Peach 類使用了 @Sweet 注解,但是并沒有在 RedPeach 類使用該注解。

//聲明一個Sweet注解,標(biāo)識甜味。

@Inherited

@Retention(RetentionPolicy.RUNTIME)

@interface Sweet {}

//桃子有甜味

@Sweet

public class Peach {}

//紅色的水蜜桃

public class RedPeach extends Peach {}

雖然我們沒在 RedPeach 類上使用了 @Sweet 注解,但是我們在 Sweet 注解聲明中使用了 @Inherited 注解,所以 RedPeach 繼承了 Peach 的 @Sweet 注解。

注解屬性

注解屬性類似于類方法的聲明,注解屬性里有三部分信息,分別是:屬性名、數(shù)據(jù)類型、默認(rèn)值。

在 @Autowired 注解中就聲明了一個名為 required 的 boolean 類型數(shù)據(jù),其默認(rèn)值是 true。

public @interface Autowired { boolean required() default true; }

需要注意的是,注解中定義的屬性,它的數(shù)據(jù)類型必須是 8 種基本數(shù)據(jù)類型(byte、short、int、long、float、double、boolean、char)或者是類、接口、注解及它們的數(shù)組。

注解解析

       何為解析注解?即通過反射獲取類、函數(shù)或成員上的運(yùn)行時注解信息,從而實(shí)現(xiàn)動態(tài)控制程序運(yùn)行的邏輯。

解析注解主要用到兩個類庫:

1.1.  java.lang.annotation.Annotation

Java使用Annotation接口來代表程序元素前面的注解,該接口是所有Annotation類型的父接口。

1.2. java.lang.reflect.AnnotatedElement

AnnotatedElement 接口代表程序中可以接受注解的程序元素,是所有程序元素(Class、Method、Field、Package和Constructor)的父接口。獲取該接口對象之后,即可以調(diào)用對象方法來訪問AnnotatedElement信息,常用有如下幾個:

         1. getAnnotations():返回該程序元素上存在的所有注解。

         2. isAnnotationPresent(annotation.class):判斷該程序元素上是否包含指定類型的注解

         3. getDeclaredAnnotations():返回直接存在于此元素上的所有注釋。與此接口中的其他方法不同,該方法將忽略繼承的注釋。

案例:通過注解自動生成sql(表的創(chuàng)建)

第一步:自定義注解

表名稱的注解

如何看待java注解

表屬性的注解

如何看待java注解

第二步:使用注解

如何看待java注解

第三步:解析注解

如何看待java注解

如何看待java注解

如何看待java注解

關(guān)于如何看待java注解就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI