- 注釋一定是是給程序員看的,不影響代碼的執(zhí)行。
- 注解大部分時間是給計算機看的,大部分會影響程序的編譯執(zhí)行。注解就是元數(shù)據(jù)
- 1.編譯檢查(比如override)
-
2.文檔注釋(生成doc文檔)
image.png - 3.前面兩個基本都是java給我們提供好的,我們很少有操作空間。第三種是我們需要學(xué)習(xí)的---代碼分析,通過反射技術(shù),對帶有注釋的代碼進(jìn)行分析。
自定義注解
內(nèi)置注解定義格式,分為兩部分

image.png
選中的部分是元注解,我們暫時不用管

image.png
與正常類定義的區(qū)別只是將public class Xxx變換為@interface Xxx
@+自己定義的注解名就可以使用了
注解的本質(zhì)反編譯的結(jié)果

image.png
以上可以看出,注解本質(zhì)上就是一個接口
- 接口之間只能繼承,不能實現(xiàn)
接口本質(zhì)上是接口的話,那么接口能定義什么,注解也能定義什么,接口可以定義常量、方法

注解中定義方法
-
屬性就是接口中的抽象方法
1.注解屬性不能返回void,類等
image.png
2.定義了屬性,在使用屬性的時候需要給屬性賦值
image.png
image.png
image.png
image.png
.
這就是稱之為屬性的原因。
多個值用逗號隔開

image.png
也可以給注解的屬性賦予默認(rèn)值,這樣在使用注解的時候就可以不用賦值了

image.png
如果說只有一個屬性需要復(fù)制,并且這個屬性的名稱叫做value的話,那么value就可以進(jìn)行省略了!兩個限定條件。如果有兩個屬性的話value屬性就必須顯示賦值了。
枚舉類型的值就相當(dāng)于我們的靜態(tài)常量一樣
賦值枚舉的情況。

image.png

image.png
數(shù)組賦值需要{}包裹,如果數(shù)組中只有一個值,則大括號可以省略。
元注解
用于描述注解的注解。所以本質(zhì)上還是注解。

image.png
元注解是JDK給我們定義好的
- @Target 描述注解能夠作用的位置
- @Retention 描述注解被保留的階段(java代碼有三個階段1.源碼階段-source 2.class階段3.runtime階段 )
- @Documented 描述注解是否被抽取到API文檔中(javadoc 命令抽取文檔)
- @Inherited 描述注解是否被子類繼承,如果加了該元注解的話,子類會自動繼承父類被該元注解描述的那個注解
栗子

image.png

image.png
使用注解
- 在程序中使用(解析)注解:主要方法就是在程序運行時獲取注解中定義的屬性值(怎么辦呢?當(dāng)然是通過反射了!)
- 有了注解之后,我們就可以用來簡化配置文件的相關(guān)工作
- 其實注解在很多情況下的作用就是用來取代配置文件,在這種情況下注解≈配置文件
- 我們知道反射的作用是不改變調(diào)用反射方方法中任何的代碼,可以創(chuàng)建任意類的對象,可以執(zhí)行任意方法
具體的自定義注解使用案例

image.png

image.png

image.png
以上就拿到了注解中配置的屬性值了!!!
最后根據(jù)全類名與方法名使用反射調(diào)用配置的方法就可以了

image.png
總結(jié)

image.png
另起一個話題---java執(zhí)行階段

image.png
java中萬物皆對象,所有代碼的出發(fā)點也應(yīng)該是對象,在內(nèi)存中有class類對象來描述字節(jié)碼文件
.java->.calss->加載到方法區(qū)->生成類對象->main方法進(jìn)棧執(zhí)行->new 關(guān)鍵字開辟內(nèi)存空間->根據(jù)方法區(qū)中的內(nèi)容在內(nèi)存中生成對象
java中的反射就是將類的各個組成部分封裝為各種對象Field,Meethod,構(gòu)造類對象等等






