[TOC]
## 元注解
元注解是可以注解到注解上的注解,或者說元注解是一種基本注解。
### @Retention
Retention 的英文意為保留期的意思。當 @Retention 應用到一個注解上的時候,它解釋說明了這個注解的的存活時間。
它的取值如下:?
* RetentionPolicy.SOURCE 注解只在源碼階段保留,在編譯器進行編譯時它將被丟棄忽視。?
* RetentionPolicy.CLASS 注解只被保留到編譯進行的時候,它并不會被加載到 JVM 中。?
* RetentionPolicy.RUNTIME 注解可以保留到程序運行的時候,它會被加載進入到 JVM 中,所以在程序運行時可以獲取到它
### @Target
Target 是目標的意思,@Target 指定了注解運用的地方。
@Target 有下面的取值
* ElementType.ANNOTATION\_TYPE 可以給一個注解進行注解
* ElementType.CONSTRUCTOR 可以給構造方法進行注解
* ElementType.FIELD 可以給屬性進行注解
* ElementType.LOCAL\_VARIABLE 可以給局部變量進行注解
* ElementType.METHOD 可以給方法進行注解
* ElementType.PACKAGE 可以給一個包進行注解
* ElementType.PARAMETER 可以給一個方法內的參數進行注解
* ElementType.TYPE 可以給一個類型進行注解,比如類、接口、枚舉
### @Inherited
Inherited 是繼承的意思,但是它并不是說注解本身可以繼承,而是說如果一個超類被 @Inherited注解過的注解進行注解的話,那么如果它的子類沒有被任何注解應用的話,那么這個子類就繼承了超類的注解。
### @Documented
顧名思義,這個元注解肯定是和文檔有關。它的作用是能夠將注解中的元素包含到 Javadoc 中去。
### @Repeatable
Repeatable 自然是可重復的意思。@Repeatable 是 Java 1.8 才加進來的,所以算是一個新的特性。
什么樣的注解會多次應用呢?通常是注解的值可以同時取多個。
~~~
@Person(role="artist")
@Person(role="coder")
@Person(role="PM")
public class SuperMan{
}
~~~
## Java 預置的注解
### @Deprecated
這個元素是用來標記過時的元素
### @Override
這個大家應該很熟悉了,提示子類要復寫父類中被 @Override 修飾的方法
## 運行期提取注解
java.lang.reflect 包下主要包含一些實現反射功能的工具類,實際上,java.lang.reflect 包所有提供的反射API擴充了讀取運行時Annotation信息的能力。當一個Annotation類型被定義為運行時的Annotation后,該注解才能是運行時可見,當class文件被裝載時被保存在class文件中的Annotation才會被虛擬機讀取。
AnnotatedElement 接口是所有程序元素(Class、Method和Constructor)的父接口,所以程序通過反射獲取了某個類的AnnotatedElement對象之后,程序就可以調用該對象的如下四個個方法來訪問Annotation信息:
### getAnnotation
T getAnnotation(Class annotationClass)
返回改程序元素上存在的、指定類型的注解,如果該類型注解不存在,則返回null。
### isAnnotationPresent
boolean isAnnotationPresent(Class annotationClass)
判斷該程序元素上是否包含指定類型的注解,存在則返回true,否則返回false.
### getAnnotations
Annotation\[\] getAnnotations()
返回該程序元素上存在的所有注解。
### getDeclaredAnnotations
Annotation\[\] getDeclaredAnnotations()
返回直接存在于此元素上的所有注釋。與此接口中的其他方法不同,該方法將忽略繼承的注釋。(如果沒有注釋直接存在于此元素上,則返回長度為零的一個數組。)該方法的調用者可以隨意修改返回的數組;這不會對其他調用者返回的數組產生任何影響。
## 編譯期提取注解
在其他文章再細說
## 推薦閱讀
[深入理解Java:注解(Annotation)--RUNTIME運行時注解的處理](https://blog.csdn.net/fei20121106/article/details/51353725)
[Java注解深入淺出](https://blog.csdn.net/shengzhu1/article/details/81271409)
- Java
- Object
- 內部類
- 異常
- 注解
- 反射
- 靜態代理與動態代理
- 泛型
- 繼承
- JVM
- ClassLoader
- String
- 數據結構
- Java集合類
- ArrayList
- LinkedList
- HashSet
- TreeSet
- HashMap
- TreeMap
- HashTable
- 并發集合類
- Collections
- CopyOnWriteArrayList
- ConcurrentHashMap
- Android集合類
- SparseArray
- ArrayMap
- 算法
- 排序
- 常用算法
- LeetCode
- 二叉樹遍歷
- 劍指
- 數據結構、算法和數據操作
- 高質量的代碼
- 解決問題的思路
- 優化時間和空間效率
- 面試中的各項能力
- 算法心得
- 并發
- Thread
- 鎖
- java內存模型
- CAS
- 原子類Atomic
- volatile
- synchronized
- Object.wait-notify
- Lock
- Lock之AQS
- Lock子類
- 鎖小結
- 堵塞隊列
- 生產者消費者模型
- 線程池