官方定義:java
Java 註解用於爲 Java 代碼提供元數據。做爲元數據,註解不直接影響你的代碼執行,但也有一些類型的註解實際上能夠用於這一目的。Java 註解是從 Java5 開始添加到 Java 的。數組
元註解定義bash
元註解的做用就是負責註解其餘註解。Java5.0定義了4個標準的meta-annotation類型,它們被用來提供對其它 annotation類型做說明。Java5.0定義的元註解ide
對於註解的跟人理解。舉個不恰當的比喻,註解就比如現實的標籤。好比高富帥標籤,那麼元註解就是具體來註解規範這個高富帥標籤的內容。好比經過元註解規定這個高富帥標籤只能給人使用,動物則不行。好比這個標籤只對成年人有效,小孩子會自動忽略等。post
Retention 的英文意爲保留期的意思。當 @Retention 應用到一個註解上的時候,它解釋說明了這 個註解的的存活時間。 它的取值以下:性能
這3個生命週期分別對應於:Java源文件(.java文件) ---> .class文件 ---> 內存中的字節碼ui
因爲不一樣註解使用的時間是不一樣的,好比動態註解是在運行時獲取註解進行相應操做的,靜態註解則在編譯的時候。因此要精細劃分註解的保留時間就須要這個元註解。使用以下:spa
@Retention(RetentionPolicy.RUNTIME)
public @interface TestAnnotation {
}
複製代碼
這個元註解確定是和文檔有關。它的做用是可以將註解中的元素包含到 Javadoc 中去code
@Target 指定了註解運用的地方。就看該標籤是運用到類仍是說方法仍是說其餘某些地方。 具體@Target取值有繼承
Inherited 是繼承的意思,可是它並非說註解自己能夠繼承,而是說若是一個超類被 @Inherited 註解過的註解進行註解的話,那麼若是它的子類沒有被任何註解應用的話,那麼這個子類就繼承了超類的註解。
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@interface Test {}
@Test
public class A {}
public class B extends A {}
複製代碼
註解 Test 被 @Inherited 修飾,以後類 A 被 Test 註解,類 B 繼承 A,類 B 也擁有 Test 這個註解。
Java 默認帶了一些註解,平時開發的時候其實也已經在默默使用了。
該註解用來標記過期的元素,若某個類或者方法或者元素等被標記了,那麼別的引用到那處代碼的地方會出現劃線,進行標示,提醒使用者,這個代碼已通過時,使用要慎重。
@Deprecated
public void stopPullLoading() {
}
複製代碼
java.lang.Override 是一個marker annotation類型,它被用做標註方法。它說明了被標註的方法重載了父類的方法,起到了斷言的做用。若是咱們使用了這種annotation在一個沒有覆蓋父類方法的方法時,java編譯器將以一個編譯錯誤來警示。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
複製代碼
此註解能告訴Java編譯器關閉對類、方法及成員變量的警告。 SuppressWarning不是一個marker annotation。它有一個類型爲String[]的成員,這個成員的值爲被禁止的警告名。對於javac編譯器來說,被-Xlint選項有效的警告名也一樣對@SuppressWarings有效,同時編譯器忽略掉沒法識別的警告名。
@SuppressWarnings(value={"unchecked","fallthrough"})
public void lintTrap() { /* sloppy method body omitted */ }
複製代碼
使用@interface自定義註解時,自動繼承了java.lang.annotation.Annotation接口,由編譯程序自動完成其餘細節。在定義註解時,不能繼承其餘的註解或接口。@interface用來聲明一個註解,其中的每個方法其實是聲明瞭一個配置參數。方法的名稱就是參數的名稱,返回值類型就是參數的類型(返回值類型只能是基本類型、Class、String、enum)。能夠經過default來聲明參數的默認值。
註解參數的可支持數據類型:
Annotation類型裏面的參數該怎麼設定: 第一,只能用public或默認(default)這兩個訪問權修飾.例如,String value();這裏把方法設爲defaul默認類型; 第二,參數成員只能用基本類型byte,short,char,int,long,float,double,boolean八種基本數據類型和 String,Enum,Class,annotations等數據類型,以及這一些類型的數組.例如,String value();這裏的參數成員就爲String; 第三,若是隻有一個參數成員,最好把參數名稱設爲"value",後加小括號.例:下面的例子FruitName註解就只有一個參數成員。
簡單的自定義註解和使用註解實例:
package annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 水果名稱註解
* @author wangsheng
*
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FruitName {
String value() default "";
}
複製代碼
我的開發時註解的做用:
通常在運行時反射獲取到註解的內容,而後進行相應的操做,好比綁定id等。 參考瞭解:juejin.im/post/5c21fe…
須要使用到APT,在代碼編譯階段根據註解完成相應代碼的添加,因爲在編譯階段完成了相關工做,因此影響比動態註解小,性能更好。
(留坑接下來寫文章填)