Java注解三連問
前言
注解的內(nèi)容很多,本次的面試題講解主要是針對以下幾個問題:
1,注解是在編譯期生效還是運行期生效?
2,有沒有只在編譯期生效的注解?
3,編譯期生效的注解和運行期生效的注解有什么區(qū)別?
我們的分析如下:
首先,第一個問題是給面試者挖坑,兩者都存在,關(guān)鍵看注解的定義描述;
其次,第二個問題是有,比如我們JDK默認提供注解@Oerride
我們觀察其注解的定義如下
上面的兩個注解說明做下解釋:
@Target(ElementType.METHOD) :表示該注解可以放在方法的定義上
@Retention(RetentionPolicy.SOURCE) : 表示該注解在編譯期有效
那什么是編譯期有效?
就好比我們說的@Oerride,它的作用就是在編譯期間,檢查我們重寫的代碼有沒有符合語法規(guī)則,如果不符合就會通過紅線報錯,編譯失敗,而真正到運行期間就沒有作用了
最后,說第三個問題
就是運行期的注解有什么用,其實我們用過的很多框架,他們都會提供注解,這些都不是JDK提供的注解,我們統(tǒng)稱為自定義注解
比如Springweb提供的
@RestController
我們觀察其注解的定義說明如下:
我們可以看到其關(guān)鍵點的描述為:
@Retention(RetentionPolicy.RUNTIME) : 表示是運行期有效
最后
為什么需要定義為運行期有效?
大家想想,我們創(chuàng)建Controller是不是在服務(wù)運行期間才正式對外提供服務(wù)的,而Spring容器需要去檢查到底哪些Controller可以對外提供服務(wù),那么以這個自定義注解為暗號,一看,咦,你小子有這個注解,行了,你就是可以對外提供服務(wù)的人,所以注解必須是在運行期間有效
希望對大家有所幫助!