前言
這是我在分析CC1后留下的問題 不懂就學
Annotation 中文譯過來就是注解、標釋的意思,在 Java 中注解是一個很重要的知識點,但經常還是有點讓新手不容易理解。
注解語法
因為平常開發少見,相信有不少的人員會認為注解的地位不高。其實同 classs 和 interface 一樣,注解也屬於一種類型。它是在 Java SE 5.0 版本中開始引入的概念。
注解通過 interface定義 比如
public @interface Exploit{ }
就創建了一個Exploit的注解
注解的使用
@Exploit public class HelloExp{ }
創建一個類 HelloExp,然后在類定義的地方加上 @Exploit 就可以用 Exploit 注解這個類了。
你可以簡單理解為將 Exploit這張標簽貼到 Test 這個類上面。
不過,要想注解能夠正常工作,還需要介紹一下一個新的概念那就是元注解。
元注解
元注解是什么意思呢?
元注解是可以注解到注解上的注解,或者說元注解是一種基本注解,但是它能夠應用到其它的注解上面。
如果難於理解的話,你可以這樣理解。元注解也是一張標簽,但是它是一張特殊的標簽,它的作用和目的就是給其他普通的標簽進行解釋說明的。
元標簽有 @Retention、@Documented、@Target、@Inherited、@Repeatable 5 種。
@Retention
@Retention注解指明被標記的注解如何存儲:
1. RetentionPolicy.SOURCE 表示被標記的注解,僅僅只在代碼級被保留,同時會被編譯器忽略;
2. RetentionPolicy.CLASS 該標記表示被標記的注解會被編譯器保留,但僅僅在編譯期保留,但是會被JVM忽略;
3. RetentionPolicy.RUNTIME 該標記的注解,表示會被JVM保留,可以在運行時被使用。
例如
@Documented
這個元注解肯定是和文檔有關。它的作用是能夠將注解中的元素包含到 Javadoc 中去。
@Target
Target 是目標的意思,@Target 指定了注解運用的地方。
你可以這樣理解,當一個注解被 @Target 注解時,這個注解就被限定了運用的場景。
類比到標簽,原本標簽是你想張貼到哪個地方就到哪個地方,但是因為 @Target 的存在,它張貼的地方就非常具體了,比如只能張貼到方法上、類上、方法參數上等等。@Target 有下面的取值
1. ElementType.ANNOTATION_TYPE 應用於一個注解類型
2. ElementType.CONSTRUCTOR 應用於構造函數
3. ElementType.FIELD 應用於類的屬性
4. ElementType.LOCAL_VARIABLE 應用於局部變量
5. ElementType.METHOD 應用於方法
6. ElementType.PACKAGE 應用於包
7. ElementType.PARAMETER 應用於方法的參數
8. ElementType.TYPE 應用於類的元素
@Inherited
Inherited 是繼承的意思,但是它並不是說注解本身可以繼承,而是說如果一個超類被 @Inherited 注解過的注解進行注解的話,那么如果它的子類沒有被任何注解應用的話,那么這個子類就繼承了超類的注解。 說的比較抽象。代碼來解釋。
其實簡單理解就是繼承 但是前提是自身沒有被任何注解
girl擁有了Boy的注解叫做Father
@Repeatable
Repeatable 自然是可重復的意思。@Repeatable 是 Java 1.8 才加進來的,所以算是一個新的特性。
什么樣的注解會多次應用呢?通常是注解的值可以同時取多個。
舉個例子,一個人他既是程序員又是產品經理,同時他還是個畫家。
這里Persons是一個注解,我們用Repeatable元注解去給Person當注解 然后Person就可以當一個注解容器
所以Person就必須要有一個值 因為我們Person有String的屬性 所以我們在使用Person注解的時候需要給role賦值
Java 預置的注解
學習了上面相關的知識,我們已經可以自己定義一個注解了。其實 Java 語言本身已經提供了幾個現成的注解。
@Deprecated
這個元素是用來標記過時的元素,想必大家在日常開發中經常碰到。編譯器在編譯階段遇到這個注解時會發出提醒警告,告訴開發者正在調用一個過時的元素比如過時的方法、過時的類、過時的成員變量。
@Override
這個大家應該很熟悉了,提示子類要復寫父類中被 @Override 修飾的方法
@SuppressWarnings
阻止警告的意思。之前說過調用被 @Deprecated 注解的方法后,編譯器會警告提醒,而有時候開發者會忽略這種警告,他們可以在調用的地方通過 @SuppressWarnings 達到目的。
@SafeVarargs
參數安全類型注解。它的目的是提醒開發者不要用參數做一些不安全的操作,它的存在會阻止編譯器產生 unchecked 這樣的警告。它是在 Java 1.7 的版本中加入的。
@FunctionalInterface
函數式接口注解,這個是 Java 1.8 版本引入的新特性。函數式編程很火,所以 Java 8 也及時添加了這個特性。
函數式接口 (Functional Interface) 就是一個具有一個方法的普通接口。
注解與反射
注解通過反射獲取。首先可以通過 Class 對象的 isAnnotationPresent() 方法判斷它是否應用了某個注解
上面的例子中,只是檢閱出了注解在類上的注解,其實屬性、方法上的注解照樣是可以的。同樣還是要假手於反射。
參考
https://zhuanlan.zhihu.com/p/27643133
代碼已存放github
https://github.com/nolan124/JavaStduys/