概念
- 作用在類沃缘、方法、成員變量上
- 與業(yè)務(wù)邏輯無關(guān)则吟,有類似切面的概念槐臀,起輔助作用
- 可以在編譯和運行時起作用
作用
- 生成文檔。@Param, @Return, @Author, 這些是出現(xiàn)在注釋里的
- 編譯時檢查氓仲,如@Override 注在方法上會檢查該方法是否覆蓋了超類方法
- 執(zhí)行特定切面邏輯如 @Entity, @Transactional
原理
- 本質(zhì)是一個繼承了Annotation的特殊接口,特殊之處在于 定義時用 public @interface AnnotationName
- @interface 會標(biāo)志該自定義接口 繼承 java.lang.Annotation 接口
- 再簡化上面這句話水慨,即注解是一種接口,而且是特殊接口
- 既然是接口, 那實際運行時就會是其實現(xiàn)類敬扛,而且該實現(xiàn)類我們未定義
- 注解的實現(xiàn)類是 Java runtime 生成的動態(tài)代理對象$Proxy1晰洒,
- 而且,通過掃描所有類舔哪,反射判斷其是否有annotation欢顷,然后創(chuàng)建代理
- 且代理是JDK 面向接口的代理
- 通過代理對象Proxy instance 調(diào)用 自定義注解(接口)中的方法,最終調(diào)用AnnotationInvocationHandler的invoke方法
元注解
- java.lang.annotation提供4種元注解捉蚤,注解自定義注解
- @Documented- 注解是否包含在JavaDoc中抬驴??
- @Retention- 在哪個階段起作用缆巧,結(jié)束這個階段就可以丟棄了布持,標(biāo)志注解的生命周期
- RetentionPolicy.SOURCE, 編譯期間起作用,編譯結(jié)束后不再有任何意義陕悬,編譯后丟掉不會寫入字節(jié)碼
- @Override, @SuppressWarnings
- RetentionPolicy.CLASS, 在類加載時候起作用题暖,在字節(jié)碼中存在且被需要,類加載結(jié)束則被丟棄,運行時獲取不到該注解注解默認(rèn)聲明周期
- Retention.RUNTIME, 始終不丟棄胧卤,運行前保留
- 故反射機(jī)制終于可以起到作用了唯绍,可以讀取該注解
- 我們自定義注解一般使用這種方式
- RetentionPolicy.SOURCE, 編譯期間起作用,編譯結(jié)束后不再有任何意義陕悬,編譯后丟掉不會寫入字節(jié)碼
- @Target- 注解用于什么地方
- ElementType.Type, 用于接口(包括注解類型)、類枝誊、enum
- 如 @Entity况芒,@Controller, @Target
- ElementType.METHOD,
- 如 @Override
- ElementType.PARAMETER, 方法參數(shù)
- 如 @RequestParam, @RequestBody
- ElementType.Type, 用于接口(包括注解類型)、類枝誊、enum
- @Inherited- 類A被注解了,且該注解標(biāo)明了@Inherited 叶撒,那A的子類會同樣被注解绝骚,繼承性
注解分類
- 標(biāo)記類注解,如@Override祠够,@Deprecated, 聯(lián)想 標(biāo)記接口井辆,如Serializable挪圾,Cloneable
- 非標(biāo)記接口
自定義注解的規(guī)則
- 類型定義 @interface,且 不能 再去繼承其他接口
- 參數(shù)成員只能用 public 聯(lián)想,注解本質(zhì)就是一個接口
- 參數(shù)成員只能是 8 大基本類型和String包雀、Enum迟几、Class诗良、Annotation及 這些類型的數(shù)組
- 要獲取類台猴、方法、字段的注解信息叽奥,必須通過反射
- 注解也可以沒有定義成員扔水,如標(biāo)記類注解
總結(jié)
- 注解就是一種標(biāo)志、判斷作用朝氓,
- 與@Override 類標(biāo)記注解不同魔市,Retention.RUNTIME 類注解是在 運行時起 標(biāo)記作用,從而對其標(biāo)志的對象(類赵哲、變量待德、方法等)來添加邏輯
- 為了更好的規(guī)定如何對標(biāo)志對象增強(qiáng)邏輯,在自定義注解類中添加變量進(jìn)一步作為判斷
- 聯(lián)想 @RequestMapping(method=GET), @Transactional(isolation=true) 等
- 即枫夺,運行時標(biāo)記