1. 程式人生 > 其它 >Java註解和反射(一)註解的簡介

Java註解和反射(一)註解的簡介

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();
}