Java SE:註解和反射
阿新 • • 發佈:2021-12-17
Annotation-註解
概述
Annotation 是 JDK 5.0 引入的技術。
-
作用
- 對程式做出解釋(該作用類似 註釋-comment);
- 可以被程式讀取(如 編譯器)。
-
格式:@註解名 (引數)
// 例項 @Override @SuppressWarnings(value = "unchecked")
-
使用範圍
- 在package、class、method、field等的上方使用;
- 可以通過反射機制來訪問。
內建註解
- @Override:重寫超類方法;
- @Deprecated:方法不建議使用;
- @SuppressWarnings:抑制編譯時的警告資訊。
元註解
元註解 (meta-annotation) 負責註解其它的註解
Java 定義了 4 個元註解:
- @Documented:生成 JavaDoc 文件
- @Retention:保留級別(在哪裡有效)
- SOURCE:原始碼
- CLASS:類
- RUNTIME:執行時
- @Target:使用範圍(在哪裡使用)
- TYPE
- FILED
- METHOD
- PARAMETER
- CONSTRUCTOR
- LOCAL_VARIABLE
- ANNOTATION_TYPE
- PACKAGE
- 1.8 引入
- TYPE_PARAMETER
- TYPE_USE
- @Inherited:子類可以繼承父類中的該註解
自定義註解
使用 @interface 自定義註解,自動實現介面
java.lang.annotation.Annotaion
-
宣告格式
@元註解 public @interface 註解名{ 引數型別 引數名(); }
-
方法,實際上是宣告一個引數;
- 方法名即引數名;
- 方法返回值型別即引數返回值型別,且只能是基本型別
- 可以通過 default 來宣告預設值,通常用空串和 0;
-
如果只有一個引數,引數名為 value。在使用註解的時候可以省略
value=""
例項1.1
- @Documented:無
- @Retention:原始碼範圍;
- @Target:METHOD (方法);
- @Inherited:無
- 引數個數:2
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyAnnotation {
int id();
String name();
}
測試
-
註解只能在方法上使用,在其它位置使用會報錯
-
在類上使用
-
在本地變數使用
-
-
使用時必須給引數賦值,並且指明引數名(可以不按引數的宣告順序來賦值)
-
不賦值 / 沒有全部賦值
-
沒有指明引數名
-
例項1.2
- 在例項1的基礎上,設定引數預設值。
@Retention(RetentionPolicy.SOURCE)
@Target(ElementType.METHOD)
public @interface MyAnnotation {
int id() default 0;
String name() default "";
}
測試
-
沒有顯式賦值的引數,為預設值
-
給部分引數賦值
例項2
- @Documented:有
- @Retention:執行時範圍;
- @Target:TYPE (型別)、方法 (METHOD);(用陣列把多個級別括起來)
- @Inherited:有
- 引數個數:1,以 value 作為屬性名
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
public @interface MyAnnotation2 {
String value();
}
測試
- 在類、方法上方都可以使用;
- 使用時可以省略引數名:即無需指定 (value ="xxx") ,直接 ("xxx") 賦值。