Java注解编程原理

一、先了解以下4个元注解

@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 //运行时运行
}

二、再看一个Demo

注解定义

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

   

猜你喜欢

转载自my.oschina.net/u/2604795/blog/1605371