自定义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
java annotation 获取属性
时间: 2024-10-10 08:59:58