「每日分享」兩分鐘快速了解註解

我在這裡,等風也等你

各位開發童鞋,註解這個東西我們肯定每天都能看見,也許有時候看的太多了到是會忽略註解這東西具體是如何工作的。今天在這裡用最短的篇幅快速講解下註解的原理,對這塊記的不太清楚的同學也可以再次看看,下次有人詳細問這塊的話不至於一知半解。

元註解

「每日分享」兩分鐘快速瞭解註解

把註解講完這一個栗子就夠了,可以看到自定義註解裡也會有註解存在,給自定義註解使用的註解就是元註解:

  • @Rentention Rentention用來標記自定義註解的有效範圍,一般就三種:RetentionPolicy.SOURCE 只在源代碼中保留 一般都是用來增加代碼的理解性或者幫助代碼檢查之類的,比如我們的Override;RetentionPolicy.CLASS 默認的選擇,能把註解保留到編譯後的字節碼class文件中,僅僅到字節碼文件中,運行時是無法得到的;RetentionPolicy.RUNTIME,註解不僅 能保留到class字節碼文件中,還能在運行通過反射獲取到,一般我們真正用到的都是這種。(這個點在面試過程中有可能被問到,記性不好的趕緊收藏一下,下次要面試之前可以快速瀏覽一遍半個月都忘不了)。
  • @Target 說明註解使用的地方,值很多,不一一細說了
  • @Documented 使用了@Documented的可以在javadoc中找到
  • @Interited 可繼承性的標識,使用了Interited表示註解裡的內容可以被子類繼承,比如父類中某個成員使用了上述@From(value),From中的value能給子類使用到。

關鍵字和註解內容

  • @interface 這個東西在聲明註解的時候必須得使用,用@interface就意味著這個東西已經繼承了java.lang.annotation.Annotation,也說明了它是一個註解。

然後就是註解裡的內容了,上述From中定義了兩項內容,所以這個註解可以這麼用:@From(1),或者是@From(value = 1,canBuNull = true)或者是@From(canBuNull = true),那麼能不能寫成@From(true)呢。當然不能,當括號裡內容不以鍵值對形式出現的話默認是使用value的。

工作原理

最再說說註解的工作原理吧。也很簡單,一般我們自定義的RetentionPolicy.RUNTIME比較多,就說一下它的大概原理吧,其實可以把這種註解理解成一個可以接收參數的方法,只不過這個方法的處理邏輯是別人事先寫好的,使用了RetentionPolicy.RUNTIME的註解括號裡提供的參數都是可以通過反射拿到,舉個很簡單的栗子,就拿下面來說:

From(R.id.tvLogin)

TextView tvLogin;

用這個From來接受一個id最後給tvLogin注入TextView的實例,我們在定義了這個@From註解後,再提供一個方法,在需要注入的時機調用(eg:OnCreate())

「每日分享」兩分鐘快速瞭解註解

就這樣,通過From就輕鬆得省去了一大堆findViewById的方法,說到底,註解最大的好處就是讓代碼變得簡潔明瞭然後還能減少一些重複的機械勞動,解放雙手。

其實註解就那麼點東西,很簡單的,平時如果使用的太多而而忽略了它的原理就有點不太靠譜了,個人覺得做到理解了就行,很多內容全要記下來也是不可能的,只要明白了原理,太細節的地方用的時候再來查完全都不是問題了。

原文鏈接:https://juejin.im/entry/57a0644ba341310063010145


分享到:


相關文章: