java annotation 获取属性

自定义Annotation

1.声明一个annotation,类型是@interface

//声明注解
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ValueBind {
    enum fieIdType {
        STRING, INT
    };

    fieIdType type() default fieIdType.STRING;// 为属性提供一个默认值

    String value() default "sandy";

}

@Target 表示注解用在什么位置,我这里用在属性上面,可用ElementType枚举类型主要有:

    TYPE : 类、接口或enum声明

    FIELD: 域(属性)声明

           METHOD: 方法声明

           PARAMETER: 参数声明

           CONSTRUCTOR: 构造方法声明

           LOCAL_VARIABLE:局部变量声明

           ANNOTATION_TYPE:注释类型声明

           PACKAGE: 包声明

@Retention 表示需要在什么级别保存该注解信息。可用RetentionPolicy枚举类型主要有:

             SOURCE: 注解将被编译器丢弃(编译的时候删除掉)。

             CLASS  :  注解在class文件中可用。但会被VM丢弃。

             RUNTIME: VM将在运行时也保存注解(一般都是用这个,运行时通过反射读取注解)

@Documented:  将此注解包含在Javadoc中

 

2.新建一个需要使用Annotation的类

import test.annotation.ValueBind.fieIdType;

public class Student {
    /** 因为我为String类型在annotation文件中已经添加了默认值,所以这里可以不用值 **/
    @ValueBind
    public String name;
    /** 因为这的默认值是String类型,而这用了int类型 ,所以我这里重新设了值  **/
    @ValueBind(type = fieIdType.INT, value = "15")
    public int age;

    public String toString() {
        return String.format("Student[name=%s,age=%d]", name, age);
    }
}

3.通过反射机制,得到Annotation的值

public static void main(String[] args) throws Exception {
        //通过反射得到类
        Object obj = Class.forName("test.annotation.Student").newInstance();
        // 得到类的属性列表
        Field[] fields = obj.getClass().getDeclaredFields();
        for (int i = 0; i < fields.length; i++) {
            // 这个是检查类中属性是否含有注解
            if (fields[i].isAnnotationPresent(ValueBind.class)) {
                // 获取注解
                ValueBind annotation = fields[i].getAnnotation(ValueBind.class);
                String type = annotation.type().toString();
                if (type.equals("INT")) {
                    fields[i].setInt(obj, Integer.parseInt(annotation.value()));
                } else if (type.equals("STRING")) {
                    fields[i].set(obj, annotation.value());
                }
            }
        }
        System.out.println(((Student) obj).toString());
    }

文笔不好,看不看得懂,随意

参考:

http://blog.csdn.net/lifetragedy/article/details/7394910

http://www.cnblogs.com/linjiqin/archive/2011/02/16/1956426.html

posted @ 2014-07-09 17:22  sleepend  阅读(3718)  评论(0编辑  收藏  举报