一、簡介
註解是Java 1.5引入的,可以提供程式碼的額外資訊,目前正在被廣泛應用。除了Java內建註解,我們也可以自定義註解。
以下就是一個自定義註解的簡單例子:
@Target(ElementType.TYPE) //註解作用於型別(類,介面,註解,列舉)
@Retention(RetentionPolicy.RUNTIME) //執行時保留,執行中可以處理
@Inherited // 註解將被用於該類的子類
@Documented // 生成javadoc檔案
public @interface JsAnnotation {
String DEFAULT_VALUE = "JS";
/**
* 建立此value方法,則使用註解時可直接傳參,如 @JsAnnotation("msg")
*
* @return
*/
String value() default DEFAULT_VALUE;
}
複製程式碼
自定義註解關鍵點:
- @interface關鍵字定義註解
- 註解可以被其它註解修飾,最重要的就是元註解
- 註解和介面類似,內部可以定義常量和方法
- 註解定義的方法有一些限制:方法不能有引數;返回值只能是基本型別、字串、Class、列舉、註解、及以上型別的陣列;可以包含預設值
二、元註解介紹
元註解就是定義註解的註解。
包含@Target、@Retention、@Inherited、@Documented這四種
1、@Target
描述註解的使用目標。
其原始碼為:
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.ANNOTATION_TYPE})
public @interface Target {
ElementType[] value();
}
複製程式碼
註解方法返回值是ElementType[],ElementType列舉型別,列舉值就是@Target註解的可取值。
方法名value,這樣在使用註解時,可以不需要指定方法名。
可取的值有:
取值 | 含義 |
---|---|
ElementType.PACKAGE | 註解作用於包 |
ElementType.TYPE | 註解作用於型別(類,介面,註解,列舉) |
ElementType.ANNOTATION_TYPE | 註解作用於註解 |
ElementType.CONSTRUCTOR | 註解作用於構造方法 |
ElementType.METHOD | 註解作用於方法 |
ElementType.PARAMETER | 註解作用於方法引數 |
ElementType.FIELD | 註解作用於屬性 |
ElementType.LOCAL_VARIABLE | 註解作用於區域性變數 |
注意:預設可以作用於以上任何目標。
2、@Retention
描述註解的生命週期。
其原始碼為:
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.ANNOTATION_TYPE})
public @interface Retention {
RetentionPolicy value();
}
複製程式碼
註解方法返回值是列舉型別RetentionPolicy,列舉值就是@Retention註解的可取值。
可取的值有:
取值 | 含義 |
---|---|
RetentionPolicy.SOURCE | 原始碼中保留,編譯期可以處理 |
RetentionPolicy.CLASS | Class檔案中保留,Class載入時可以處理 |
RetentionPolicy.RUNTIME | 執行時保留,執行中可以處理 |
預設RetentionPolicy.CLASS 值。
3、@Documented
描述註解可以文件化,是一個標記註解。
在生成javadoc的時候,是不包含註釋的,但是如果註解被@Documented修飾,則生成的文件就包含該註解。
其原始碼為:
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.ANNOTATION_TYPE})
public @interface Documented {
}
複製程式碼
4、@Inherited
標記註解,使用@Inherited修飾的註解作用於一個類,則該註解將被用於該類的子類。
其原始碼為:
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.ANNOTATION_TYPE})
public @interface Inherited {
}
複製程式碼
三、自定義註解示例
1、定義註解
@Target(ElementType.TYPE) //註解作用於型別(類,介面,註解,列舉)
@Retention(RetentionPolicy.RUNTIME) //執行時保留,執行中可以處理
@Inherited // 註解將被用於該類的子類
@Documented // 生成javadoc檔案
public @interface JsAnnotation {
String DEFAULT_VALUE = "JS";
/**
* 顏色列舉
*
* @author peida
*/
enum Color {
BULE, RED, GREEN
}
/**
* 建立此value方法,則使用註解時可直接傳參,如 @JsAnnotation("msg")
*
* @return
*/
String value() default DEFAULT_VALUE;
/**
* 此方法返回為列舉型別,使用註解時,如 @JsAnnotation(color=Color.BLUE)
*
* @return
*/
Color color() default Color.BULE;
int num() default -1;
}
複製程式碼
其中:定義了三個方法,三個方法都有預設返回值。定義了Color列舉(因為註解的方法可以返回列舉型別)
這裡注意:
- value方法:使用註解時可直接傳參,如 @JsAnnotation("msg")
- 普通方法:使用註解時,如 @JsAnnotation(color=Color.BLUE)
2、使用註解
@JsAnnotation("jia shuai")
public class AnnotationTest {
}
複製程式碼
或
@JsAnnotation(num = 100)
public class AnnotationTest {
}
複製程式碼
或
@JsAnnotation(color = Color.BLUE)
public class AnnotationTest {
}
複製程式碼
3、獲取註解
public static void main(String[] args) {
AnnotationTest test = new AnnotationTest();
Class tClass = test.getClass();
JsAnnotation jsAnnotation = (JsAnnotation) tClass.getAnnotation(JsAnnotation.class);
System.out.println(jsAnnotation.value());
System.out.println(jsAnnotation.color());
System.out.println(jsAnnotation.num());
}
複製程式碼
更多精彩內容關注我的微信公眾號——Android機動車