熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

java反射Annotation

2022-06-13   來源: Java核心技術 

  import javalangannotationAnnotation;
import javalangannotationElementType;
import javalangannotationRetention;
import javalangannotationRetentionPolicy;
import javalangannotationTarget;
import javalangreflectConstructor;
import javalangreflectField;
import javalangreflectMethod;

  @Target(ElementTypeCONSTRUCTOR)
// 用於構造方法
@Retention(RetentionPolicyRUNTIME)
// 在運行時加載到Annotation到JVM中(這個一定不能丟掉否則在getAnnotation的時候取不到!!!)
@interface Constructor_Annotation {
    String value() default 默認構造方法; // 定義一個具有默認值的String型成員
}

  @Target( { ElementTypeFIELD ElementTypeMETHOD ElementTypePARAMETER })
// 用於字段方法參數
@Retention(RetentionPolicyRUNTIME)
// 在運行時加載到Annotation到JVM中
@interface Field_Method_Parameter_Annotation {
    Class type() default voidclass; // 定義一個具有默認值的Class型成員

  String describ(); // 定義一個沒有默認值的String成員
}

  public class AnnotationTest {

  @Field_Method_Parameter_Annotation(describ = 字段編號 type = intclass)
    // 注釋字段
    int id;
    @Field_Method_Parameter_Annotation(describ = 字段姓名 type = Stringclass)
    // 注釋字段
    String name;

  @Constructor_Annotation()
    // 采用默認構造方法
    public AnnotationTest() {

  }

  @Constructor_Annotation(立即初始化構造方法)
    // 注釋構造方法
    public AnnotationTest(
    // 注釋構造方法參數
            @Field_Method_Parameter_Annotation(describ = 編號 type = intclass) int id @Field_Method_Parameter_Annotation(describ = 姓名 type = Stringclass) String name) {
        thisid = id;
        thisname = name;
    }

  @Field_Method_Parameter_Annotation(describ = 獲得編號 type = intclass)
    public int getId() {
        return id;
    }

  @Field_Method_Parameter_Annotation(describ = 設置編號)
    // 成員type采用默認注釋方法
    public void setId(
    // 注釋參數
            @Field_Method_Parameter_Annotation(describ = 設置編號 type = intclass) int id) {
        thisid = id;
    }

  @Field_Method_Parameter_Annotation(describ = 獲得姓名 type = Stringclass)
    public String getName() {
        return name;
    }

  @Field_Method_Parameter_Annotation(describ = 設置姓名)
    public void setName(@Field_Method_Parameter_Annotation(describ = 姓名 type = Stringclass) String name) {
        thisname = name;
    }

  /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Autogenerated method stub
        // 構造方法
        Constructor[] declaredConstructor = AnnotationTestclassgetDeclaredConstructors(); // 獲得所有的構造方法
        for (int i = ; i < declaredConstructorlength; i++) {
            Constructor constructor = declaredConstructor[i]; // 遍歷構造方法
            if (constructorisAnnotationPresent(Constructor_Annotationclass)) // 查看是否指定類型的注釋
            {
                Constructor_Annotation ca = (Constructor_Annotation) constructorgetAnnotation(Constructor_Annotationclass);
                Systemoutprintln(cavalue()=: + cavalue());
            }

  Annotation[][] parameterAnnotations = constructorgetParameterAnnotations();// 獲得參數注釋
            for (int j = ; j < parameterAnnotationslength; j++) {
                int length = parameterAnnotations[j]length;
                if (length == ) // 如果為則表示沒有為該參數添加注釋
                {
                    Systemoutprintln(沒有為該參數添加注釋);
                } else {
                    for (int k = ; k < length; k++) {
                        // 獲得參數注釋
                        Field_Method_Parameter_Annotation pa = (Field_Method_Parameter_Annotation) parameterAnnotations[j][k];
                        Systemoutprint( + padescrib()); // 參數描述
                        Systemoutprintln( + patype()); // 參數類型
                    }
                }
            }
            Systemoutprintln(****************);
        }

  // 字段
        Systemoutprintln(********字段的Annotation*************);
        Field[] declaredFields = AnnotationTestclassgetDeclaredFields(); // 獲得所有的字段
        for (int i = ; i < declaredFieldslength; i++) {
            Field field = declaredFields[i];
            // 查看是否具有指定類型的注釋
            if (fieldisAnnotationPresent(Field_Method_Parameter_Annotationclass)) {
                Field_Method_Parameter_Annotation fa = (Field_Method_Parameter_Annotation) fieldgetAnnotation(Field_Method_Parameter_Annotationclass);
                Systemoutprint( + fadescrib()); // 獲得字段描述
                Systemoutprintln( + fatype()); // 獲得字段類型
            }
        }

  // 方法
        Systemoutprintln(********方法的Annotation*************);
        Method[] methods = AnnotationTestclassgetDeclaredMethods(); // 獲得所有的方法
        for (int i = ; i < methodslength; i++) {
            Method method = methods[i];
            // 查看是否指定注釋
            if (methodisAnnotationPresent(Field_Method_Parameter_Annotationclass))

  {
                Field_Method_Parameter_Annotation ma = (Field_Method_Parameter_Annotation) methodgetAnnotation(Field_Method_Parameter_Annotationclass);
                Systemoutprint( + madescrib()); // 獲得方法描述
                Systemoutprintln( + matype()); // 獲得方法類型
            }

  Annotation[][] parameterAnnotations = methodgetParameterAnnotations(); // 獲得所有參數
            for (int j = ; j < parameterAnnotationslength; j++) {
                int length = parameterAnnotations[j]length;
                if (length == ) {
                    Systemoutprintln(沒有添加Annotation參數);
                } else {
                    for (int k = ; k < length; k++) {
                        // 獲得指定的注釋
                        Field_Method_Parameter_Annotation pa = (Field_Method_Parameter_Annotation) parameterAnnotations[j][k];
                        Systemoutprint( + padescrib()); // 獲得參數描述
                        Systemoutprintln( + patype()); // 獲得參數類型
                    }
                }
            }
            Systemoutprintln(********************);

  }
    }

  }


From:http://tw.wingwit.com/Article/program/Java/hx/201311/26396.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.