Java註解編程原理

1、先了解如下4個元註解java

@Documented
具體來講是生成說明文檔時把類的解釋添加進去。

@Inherited 容許子類繼承父類中的註解

@Target 表示該註解用於什麼地方,可能的值在枚舉類 ElemenetType 中
public enum ElementType {
    TYPE,  //給類(型)註解
    FIELD, //給字段註解,不要忘了,字段能夠是對象
    METHOD, //給方法註解
    PARAMETER, //給參數註解
    CONSTRUCTOR, //給構造方法註解
    LOCAL_VARIABLE, //給局部變量註解
    ANNOTATION_TYPE,//給註解註解(這貌似把本身不當類來看)
    PACKAGE, //給包註解
    TYPE_PARAMETER, //不知道,等知道了我再寫在這裏
    TYPE_USE //這個也不知道
}


@Retention  表示在什麼級別保存該註解信息。可選的參數值在枚舉類型 RetentionPolicy 中
public enum RetentionPolicy {
    SOURCE, //源碼狀態運行,
    CLASS, //編譯類文件時運行
    RUNTIME //運行時運行
}

 

2、再看一個Demothis

註解定義code

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(value = { ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
public @interface UserAnnotation {
    public int id() default 0;
    public String name() default "";
    public int age() default 18;
    public String gender() default "M";
}

 

public class User {
    int id;
    String name;
    int age;
    String gender;

    public User(int id, String name, int age, String gender) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.gender = gender;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }
}

 

import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
import java.lang.reflect.Field;


public class TestMain {
    @UserAnnotation(age = 20, gender = "F", id = 2014, name = "zhangsan")//註解的使用
    public Object obj;

    public static void main(String[] args) throws Exception {
        Field objField = TestMain.class.getField("obj");
        UserAnnotation ua = objField.getAnnotation(UserAnnotation.class);//獲得註解,起到了標記的做用

        System.out.println(ua.age() + "," + ua.gender() + "," + ua.id() + "," + ua.name());
        //***進一步操做的話,假設Object要指向一個User類,那麼能夠講註解的值給他
        TestMain tm = new TestMain();
        objField.set(tm, new User(ua.age(), ua.gender(), ua.id(), ua.name())); //不錯吧,將本身的信息送給obj,起到了附加信息的做用

        //-----------請自由遐想吧~~,下面來講說註解怎麼能得到註解本身的註解-------------
        Target t = ua.annotationType().getAnnotation(Target.class);
        ElementType[] values = t.value();
        //~~~~~~~~~~~~~~完了,再一次自由遐想吧~~~~~~~~~~~~~~
        String words="瘋狂";
        System.out.println(words);
    }
}
相關文章
相關標籤/搜索