Java註解和反射(一)註解的簡介
阿新 • • 發佈:2021-12-23
Java註解和反射
註解 Java.Annotation
註解入門
內建註解
自定義註解,元註解
什麼是註解
-
Annotation是從JDK5.0開始引入的新技術
-
Annotation的作用:
- 不是程式本身,可以對程式做出解釋。(這一點和註釋(comment)沒什麼區別)
- 可以被其他程式(比如:編譯器等)讀取.
-
Annotation的格式:
- 註釋是以“@註釋名”在程式碼中存在的,還可以新增一些引數值,例如:@SuppreeWarnings(value=“unchecked”)
-
Annotation在那裡使用?
- 可以附加在Package,class,method,field等上面,相當於給他們添加了額外的輔助資訊,我們可以通過反射機制程式設計實現對這些元資料的訪問。
package com.qingkuang.annotation; import java.util.ArrayList; import java.util.List; //什麼是註解 public class Test01 extends Object{ //@Override 重寫的註解 @Override public String toString() { return super.toString(); } //@Deprecated 不推薦程式設計師使用,但可以使用,或者存在更好的方式 @Deprecated public static void test(){ System.out.println("Deprecated"); } @SuppressWarnings("all") public void test02(){ List list = new ArrayList(); } public static void main(String[] args){ test(); } }
內建註解
- @Overrride:定義在java.lang.Override中,此註釋只適用於修辭方法,表示一個方法宣告打算重寫超類中的另一個方法宣告
- @Deprecated:定義在java.lang.Deprecated中,此註釋可以用於修辭方法,屬性,類,表示不鼓勵程式設計師使用這樣的元素,通常是因為它很危險或者存在更好的選擇。
- @SuppressWarnings:定義在java.lang.SuppressWarning中,用來抑制編譯時的警告資訊。與前兩個註釋有所不同,你需要新增一個引數才能正確使用,這些引數都是已經定義好 了的,我們選擇性的使用就好了。
- @SuppressWarnnings("all")
- @SuppressWarnnings("unchecked")
- @SuppressWarnnings(value={"unchecked","deprecation"})
- 等等......
元註解
- 元註解的作用就是負責註釋其他註釋,Java定義了4個標準的meta-annotation型別,他們被用來提供對其他annotation型別作說明。
- 這些型別和它所支援的類在java.lang.annotation包中可以找到.(@Target,@Retention,@Decumented,@Inherited)
- @Target:用於描述的使用範圍(即:被描述的註解可以用在什麼地方)
- @Retention:表示需要在什麼級別儲存該註釋資訊,用於描述註釋的申明週期
- (SOURCE<CLASS<RUNTIME)
- @Decumented:說明該註解將被
- @Inherited:說明子類可以繼承父類中的該註解。
package com.qingkuang.annotation;
import java.lang.annotation.*;
//測試元註解
@MyAnnotation
public class Test02 {
@MyAnnotation
public void test(){
}
}
//定義一個註解
//Target表示我們的註解可以放在那些地方
@Target(value = {ElementType.METHOD,ElementType.TYPE})
//Retention表示我們的註解咋愛什麼地方還有效。
//SOURCE<CLASS<RUNTIME
@Retention(value = RetentionPolicy.RUNTIME)
//Documented 表示是否將我們的註解成成在JAVAdoc中
@Documented
//子類可以繼承父類的註解
@Inherited
@interface MyAnnotation{
}
自定義註解
- 使用@interface自定義註解時,自動繼承了java.lang.annotation.Annotation介面
- 分析:
- @interface用來宣告一個註解,格式:public @interface 註解名{定義內容}
- 其中的每一個方法實際上時聲明瞭一個配置引數
- 方法的名稱就是引數的名稱
- 返回值型別就是引數的型別(返回值只能是基本型別,Class,String,enum)
- 可以通過default來宣告引數的預設值
- 如果只有一個引數成員,一般引數名為value
- 註解元素必須要有值,我們定義註解元素時,經常使用空字串,0作為預設值
package com.qingkuang.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
//自定義註解
public class Test03 {
//註解可以顯示賦值,如果沒有預設值,我們就必須給註釋賦值
//@MyAnnotation2(name = "韓鎖",school = "北師大")
@MyAnnotation2(age = 18,name = "韓鎖")
public void test(){
}
//註解只有一個,就可以省略value,直接寫值,且只能省略value,要是name等其他值就不可以
@MyAnnotation3("韓鎖")
public void test02(){
}
}
@Target({ElementType.ANNOTATION_TYPE.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation2{
//註解的引數:引數型別 + 引數名();
String name() default "";
int age() default 0;
int id() default -1;//如果預設值為-1,代表不存在,indexof,如果找不到就返回-1
String[] school() default {"積水潭師專","北京郵電大學"};
}
@interface MyAnnotation3{
String value();
}