前幾年咱們的項目還在structs 2 上跑,有一次問一個同事是否知道
Spring Boot,同事說那不是用註解來開發的嗎。雖然這個答案並不徹底對,可是從客觀上Spring Boot對剛剛接觸它的人來講最醒目的就是註解了。那麼今天咱們來了解一下Java語言的核心功能——註解。java
public @interface Anno { }
以上就是一個最簡單的註解聲明。它能夠註釋到類、接口、方法以及變量上。經過向方法,接口,類或字段添加註釋,爲其綁定的源代碼分配額外的元數據。數組
經過註解咱們能夠通知編譯器有關警告和錯誤的信息在編譯時操做源代碼在運行時修改或檢查行爲。jdk提供內置5個基本註解來處理代碼檢查。安全
註解能夠將一些元數據傳遞給你編寫的邏輯。好比Spring Mvc 中的一個經常使用註解@RequestMapping,咱們能夠經過value參數來傳遞一個path路徑,Spring Mvc經過對請求的路徑的匹配來做出是否路由到該path上。 目前大量的的框架都依賴註解,好比Spring、hibernate、dubbo等等。app
元註解是能夠應用於其餘註解的註解。來加強或者配置目標註解的機制。jdk目前提供了5個元註解。若是你須要開發自定義註解,請務必熟悉它們:框架
@Retention 只能用於修飾註解,來指定被修飾註解能夠保留多長時間。規定了三種策略:ide
@Target 用於指定被修飾註解的修飾目標類型。若是一個註解明確了可修飾的目標類型,則只能修飾指定的類型。由枚舉ElementType來規定。函數
自定義註解跟自定義接口相似,可是還有一些區別,實際開發你須要對自定義註解進行元註解註釋。註解中的成員變量以無參抽象方法來聲明,成員變量並非全部類型都支持,目前只支持如下類型:工具
下面咱們就來自定義一個註解:學習
/** * 聲明一個能夠標記在類、接口、枚舉、方法上的註解。 * 而且JVM Runtime 可見、可生成文檔 * * @author Dax * @since 17 :27 2019/9/4 */ @Documented @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE, ElementType.METHOD}) public @interface Anno { /** * 若方法名爲value且註解聲明只須要聲明value屬性時, * value能夠省略, @Anno("anno") 等同於 @Anno(value="anno") * * @return the string */ String value(); /** * 一個具備默認值的 String 類型屬性。 * name若不顯式聲明,則默認值爲"" 。 * 聲明默認值經過 default + 默認值 來聲明 * * @return the string */ String name() default ""; /** * 一個Class 類型屬性,沒有默認值。其餘支持類型再也不舉例 * * @return the class */ Class<?> clazz(); }
全部的註解都是java.lang.annotation.Annotation 的子類。只有RetentionPolicy爲RUNTIME的 註解才能經過反射獲取。在反射包中提供了AnnotatedElement 接口來對元素上的可捕捉到的註解進行處理。該接口是Class、Method、Constructor等程序元素對象的父接口。也就是說只要能獲取程序元素對象就能對其存在的註解進行處理。主要方法有:編碼
基本上對這個接口的方法進行學習後就能夠知道如何獲取註解的元數據了。下面咱們寫一個例子,仍是上面的Anno註解爲例:
/** * 被註解標記的類 **/ @Anno("hello") public class Foo {} /** * 經過獲取Foo 的Class 類, * 而後就能夠根據上面已經介紹的方法來獲取value的值了 * @author dax * @since 2019/9/4 22:17 */ public class Main { public static void main(String[] args) { Anno annotation = Foo.class.getAnnotation(Anno.class); String value = annotation.value(); System.out.println("value = " + value); } }
今天咱們系統地對註解進行了概括,相信你已經對註解有了系統性的認識。其實註解還能夠幹一些花式操做,好比lombok框架。後面咱們會介紹相關的註解技術,多多關注。
關注公衆號:碼農小胖哥 獲取更多資訊