您現在的位置是:首頁 > 運動

註解很簡單?其實並沒有想當然的那麼簡單

由 劉小愛 發表于 運動2021-10-22
簡介除了上述的方法,還有兩個具有類似功能的方法:Annotation[] getAnnotations() ,返回此元素上存在的所有註釋(包括繼承的)Annotation[] getDeclaredAnnotations() ,返回直接存在於此

飯圈備註屬性什麼意思

今天是劉小愛自學Java的第52天。

感謝你的觀看,謝謝你。

話不多說,開始今天的學習:

註解很簡單?其實並沒有想當然的那麼簡單

一、Annotation概述

Annotation,翻譯過來就是註釋、註解的意思。

第47天的時候就接觸過註解,當時我還把註解和註釋弄混了,其實它們之間是大同小異的:都是一種說明。

它們的區別在於:

註釋主要是給程式設計師看的備註資訊。

註解主要是給JVM看的備註資訊。

1JDK提供的註解

註解很簡單?其實並沒有想當然的那麼簡單

①重寫註解:@Override

被@override註解修飾的方法必須是父類中的重寫方法或者是介面中的抽象方法。

其中用//修飾的句子就是註釋。

②函式式介面:@FunctionalInterface

被FunctionalInterface修飾的介面必須是函式式介面。

其中用/**/修飾的句子也是註釋。

③過時註解:@Deprecated

表示該方法已經過時了,有更好的方法可以使用。

當然過時並不代表著不能用了,依舊可以使用。

④抑制警告註解:@SuppressWarnings

讓編譯器不要報出警告資訊。

這個是什麼意思呢?

就是有的時候程式設計師寫的程式碼不是很規範,開發工具會提示警告(只是警告並不是報錯,並不影響程式的執行)。

對於剛開始學Java的人來說,可能都沒有注意這個警告,而該註解可以使編譯器不要報出警告資訊。

2自定義註解

Java裡非常重要的四大型別:

Class:類

Interface:介面

Enum:列舉

Annotation:註解

它們的建立方式是很相似的:

註解很簡單?其實並沒有想當然的那麼簡單

①定義註解名

使用@interface關鍵字定義註解類,注意不要和介面的關鍵字Interface弄混。

註解名稱以大寫開頭(大駝峰命名規則)

②定義註解屬性

屬性的格式為:屬性資料型別 屬性名();

其格式和介面中的抽象方法很類似。

但是註解只有屬性,沒有任何方法。

如果要給註解屬性定義預設值,,可以使用 default 關鍵字

註解很簡單?其實並沒有想當然的那麼簡單

但是一般不會直接賦值,都是由外部使用時才賦值的。

其中註解中並不是所有資料型別都可以使用,只能定義12種類型資料:

基本資料型別(8種)

型別(

是Class這個類,不是所有的類

字串(String型別)

列舉(Enum)

註解(Annotation)

以及它們對應的一維陣列(也就是最常用的那種)

二、Annotation使用

註解的使用是千變萬化的:

註解很簡單?其實並沒有想當然的那麼簡單

①在類上可以直接使用註解。

②在屬性上也可以使用註解。

③在方法上也可以使用註解。

以上便是註解的常用使用方式,甚至註解在引數列表中也可以直接使用。

語法:@註解(屬性名1 = XXX,屬性名2 = XXX。。。)

如果註解中只有一個屬性,可以將屬性名定義為 value,這樣使用該註解時可以省略 value=

也就是說註解中若是隻有一個value屬性,使用它時直接就可以賦值,比如:@MyAnnotation(“劉小愛”)

元註解

元,元始天尊的元,元老的元。在計算機中,可以將其理解成最初始的意思。

元註解便是最初始的註解,註解的註解,主要作用就是用來修飾自定義註解。

其中有兩種元註解,程式碼如下:

註解很簡單?其實並沒有想當然的那麼簡單

①註解@Target

它的作用在於指明

自定義註解可以使用的位置

ElementType。TYPE:可以註釋在類上

ElementType。METHOD:可以註釋在方法上

ElementType。FIELD:可以註釋在屬性上

ElementType。CONSTRUCTOR:可以註釋在構造方法上

都是很常見的英語單詞,根據其意思就能知道它的作用。

②註解@Retention

Retention,翻譯過來就是保留的意思。它的作用就是指定該註解的保留策略。

什麼叫保留策略?就可以理解成生命週期。

RetentionPolicy。SOURCE:保留到原始碼時期

RetentionPolicy。CLASS:保留到編譯時期

RetentionPolicy。RUNTIME:保留到執行時期

這兩個元註解都只有一個屬性並且叫value,所以可以直接給屬性賦值,並且原始碼也很相似。

以註解@Target為例,我們看下它的原始碼:

註解很簡單?其實並沒有想當然的那麼簡單

它們

的屬性型別都是列舉。

什麼叫列舉呢?

列舉裡面有各種各樣的屬性,全都是大寫字母。

使用列舉名可以直接呼叫這些屬性,就有點類似於使用類名直接呼叫靜態變數。

因為時間受限就不詳細說明了。

三、Annotation解析

註解有什麼方便之處呢?看下面的例子:

註解很簡單?其實並沒有想當然的那麼簡單

①建立自定義註解

使用@Target讓自定義註解可以放在方法上、構造上;

使用@Retention讓自定義註解保留到執行時期。

自定義註解中只有一個屬性,並且屬性名為value,所以可以簡寫。

②建立Student物件

分別在構造方法上和成員方法上放上自定義的註解,同時給註解的屬性賦值。

這樣做有什麼用?

如果有對應框架的話,我們直接在構造方法上放一個註解,就能夠給類的屬性賦值了。

不用我們建立物件初始化什麼的,是不是超級簡單?

當然需要有對應的框架,那底層是怎麼做到的呢?底層程式碼一般不用我們去寫,但是最好了解下它大致上是怎麼實現的。

使用的方法就是我們昨天學的反射,反射一般應用於框架中,這也是反射的厲害之處之一:

註解很簡單?其實並沒有想當然的那麼簡單

①獲取Student類對應的Class物件

每個類都有一個對應的Class物件,三種獲取Class物件的方式,選擇一種即可。

同時利用Class物件獲取對應的構造器,也就是getConstructor()方法:

如果是無參構造,方法引數就沒有。

如果是有參構造,方法引數為構造方法引數型別對應的Class物件。

②判斷構造方法上是否有註解

isAnnotationPresent()方法可以判斷是否存在註解。

因為構造方法上是可以放多個註解的。

所以引數為我們需要的註解對應的Class物件。

③獲取註解的屬性值

getAnnotation() 方法可以獲取註解,引數為對應註解的Class物件。

如果存在指定型別的註解,則返回該註解,否則返回null。

除了上述的方法,還有兩個具有類似功能的方法:

Annotation[] getAnnotations() ,返回此元素上存在的所有註釋(包括繼承的)

Annotation[] getDeclaredAnnotations() ,返回直接存在於此元素上的所有註釋(不包括繼承的)

④將註解屬性賦值給對應的物件

構造器呼叫newInstance()方法建立物件,其中引數即為註解的屬性值,這樣就能完成物件的初始化了。

以上便是對註解的解析,當然框架肯定遠遠不止這麼簡單,但利用反射的核心思想應該是差不多的。

總結:

註解很簡單?其實並沒有想當然的那麼簡單

謝謝你的觀看。

如果可以的話,麻煩幫忙點個贊,謝謝你。

推薦文章