1、先看使用效果
package com.zjft.part.business.bar2.forcreate.encoder;
/**
* 作业执行情况编码类
* */
public class Bar2JobEncoder extends AbstractEncoder{
/**
* 未执行
* */
@Description(value="未执行",code=10)
public static final int unexecuted = 10;
/**
* 已执行
* */
@Description(value="已执行",code=20)
public static final int executed = 20;
}
上段代码中的@Description(value="已执行",code=20)便是自定义annotation,下面解释怎样定义annotation,至于如何获取value和code值将稍后解释。
2、定义annotation
先上代码
package com.zjft.part.business.bar2.forcreate.encoder;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Description {
/**
* 属性值
* */
int code();
/**
* 描述
* */
String value();
}
上段代码中,@Target标签代表该annotation用于属性、方法、参数或类的声明中。本文中FIELD表示@Description用于属性声明。
3、获取annotation里值
先通过反射获取Bar2JobEncoder 类的属性,然后判断该属性是否有用@Description annotation。若有,获得获得该annotation,调用Description的方法,从而获得标签里的值。具体代码如下:
Class<?> clazz = Class.forName(clazzname);
Field[] fields = clazz.getDeclaredFields();
Set<Field> annotionFields = new HashSet<Field>();
if (fields!=null) {
for (Field field : fields) {
if (field.isAnnotationPresent(Description.class)) {
annotionFields.add(field);
}
}
}
for (Field field : annotionFields) {
Description description = field.getAnnotation(Description.class);
names[i] = description.value();
codes[i] = description.code();
i++;
}
至此,定义annotation和获取里面的值方法已介绍完成。