您現在的位置是:首頁 > 運動
註解很簡單?其實並沒有想當然的那麼簡單
飯圈備註屬性什麼意思
今天是劉小愛自學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()方法建立物件,其中引數即為註解的屬性值,這樣就能完成物件的初始化了。
以上便是對註解的解析,當然框架肯定遠遠不止這麼簡單,但利用反射的核心思想應該是差不多的。
總結:
謝謝你的觀看。
如果可以的話,麻煩幫忙點個贊,謝謝你。
推薦文章
- 煙臺黃渤海新區打造“五星級酒店叢集”背後……
但煙臺佈局五星級酒店不會侷限於黃渤海新區,而是從整體城市發展層面進行考慮...
- 世界十大最美教堂之一:聖瓦西里大教堂的特色
可瓦西里昇天大教堂為什麼是九個圓頂呢,原來那次征服戰爭的勝利被認為是得到了8位聖人的幫助,8個盔頂代表8位聖人,而中間那座最高的圓頂則象徵著上帝的至高地位,加到一起就是9個...
- 助理裁判多次失誤,你給男足世界盃首支女性裁判組打幾分?
第24分鐘,一次進攻中,助理裁判舉旗示意德國隊進攻球員處於越位位置,但皮球此時已被納瓦斯解圍,來到哥斯大黎加隊球員腳下,主裁判弗拉帕特根據有利原則並未吹停比賽,而是讓哥斯大黎加隊繼續反擊...