一.系統內置標準註解html
1.@Override 是一個標記註解類型,它被用做標註方法。java
它說明了被標註的方法重載了父類的方法,起到了斷言的做用。若是咱們使用了這種Annotation在一個沒有覆蓋父類方法的方法時,java編譯器將以一個編譯錯誤來警示。這個annotaton經常在咱們試圖覆蓋父類方法而確又寫錯了方法名時發揮威力。使用方法極其簡單:在使用此annotation時只要在被修飾的方法前面加上@Override便可。編程
2.@Deprecated,標記已過期:安全
同 樣Deprecated也是一個標記註解。當一個類型或者類型成員使用@Deprecated修飾的話,編譯器將不鼓勵使用這個被標註的程序元素。並且這種修飾具備必定的 「延續性」:若是咱們在代碼中經過繼承或者覆蓋的方式使用了這個過期的類型或者成員,雖然繼承或者覆蓋後的類型或者成員並非被聲明爲 @Deprecated,但編譯器仍然要報警。ide
值得注意,@Deprecated這個annotation類型和javadoc中的 @deprecated這個tag是有區別的:前者是java編譯器識別的,然後者是被javadoc工具所識別用來生成文檔(包含程序成員爲何已通過 時、它應當如何被禁止或者替代的描述)。函數式編程
在java5.0,java編譯器仍然象其從前版本那樣尋找@deprecated這個javadoc tag,並使用它們產生警告信息。可是這種情況將在後續版本中改變,咱們應在如今就開始使用@Deprecated來修飾過期的方法而不是 @deprecated javadoc tag。函數
3.SuppressWarnnings,抑制編譯器警告:工具
@SuppressWarnings 被用於有選擇的關閉編譯器對類、方法、成員變量、變量初始化的警告。在java5.0,sun提供的javac編譯器爲咱們提供了-Xlint選項來使編譯器對合法的程序代碼提出警告,此種警告從某種程度上表明瞭程序錯誤。例如當咱們使用一個generic collection類而又沒有提供它的類型時,編譯器將提示出"unchecked warning"的警告。一般當這種狀況發生時,咱們就須要查找引發警告的代碼。若是它真的表示錯誤,咱們就須要糾正它。例如若是警告信息代表咱們代碼中的switch語句沒有覆蓋全部可能的case,那麼咱們就應增長一個默認的case來避免這種警告。
有時咱們沒法避免這種警告,例如,咱們使用必須和非generic的舊代碼交互的generic collection類時,咱們不能避免這個unchecked warning。此時@SuppressWarning就要派上用場了,在調用的方法前增長@SuppressWarnings修飾,告訴編譯器中止對此方法的警告。
SuppressWarning不是一個標記註解。它有一個類型爲String[]的成員,這個成員的值爲被禁止的警告名。對於javac編譯器來說,被-Xlint選項有效的警告 名也一樣對@SuppressWarings有效,同時編譯器忽略掉沒法識別的警告名。 @SuppressWarnings(value={ "rawtypes", "unchecked" })學習
@SuppressWarnings({ "rawtypes", "unchecked" })spa
@SuppressWarnings("unused")
抑制警告的關鍵字
參數安全類型註解。它的目的是提醒開發者不要用參數作一些不安全的操做,它的存在會阻止編譯器產生 unchecked 這樣的警告。它是在 Java 1.7 的版本中加入的。
@SafeVarargs // Not actually safe! public static void m(List<String>... stringLists) { Object[] array = stringLists; List<Integer> tmpList = Arrays.asList(42); array[0] = tmpList; // Semantically invalid, but compiles without warnings String s = stringLists[0].get(0); // Oh no, ClassCastException at runtime! }
上面的代碼中,編譯階段不會報錯,可是運行時會拋出 ClassCastException 這個異常,因此它雖然告訴開發者要妥善處理,可是開發者本身仍是搞砸了。
Java 官方文檔說,將來的版本會受權編譯器對這種不安全的操做產生錯誤警告
5.@FunctionalInterface
函數式接口註解,這個是 Java 1.8 版本引入的新特性。函數式編程很火,因此 Java 8 也及時添加了這個特性。
函數式接口 (Functional Interface) 就是一個具備一個方法的普通接口。
好比
@FunctionalInterface public interface Runnable { /** * When an object implementing interface <code>Runnable</code> is used * to create a thread, starting the thread causes the object's * <code>run</code> method to be called in that separately executing * thread. * <p> * The general contract of the method <code>run</code> is that it may * take any action whatsoever. *
* @see java.lang.Thread#run() */ public abstract void run() }
咱們進行線程開發中經常使用的 Runnable 就是一個典型的函數式接口,上面源碼能夠看到它就被 @FunctionalInterface 註解。
可能有人會疑惑,函數式接口標記有什麼用,這個緣由是函數式接口能夠很容易轉換爲 Lambda 表達式。這是另外的主題了,有興趣的同窗請本身搜索相關知識點學習。
二.自定義註解
三.註解的提取
參考資料 http://www.cnblogs.com/peida/archive/2013/04/26/3038503.html
http://www.cnblogs.com/peida/archive/2013/04/24/3036689.html