java自定义注解的使用,通过反射取得注解的值
public class AnnotationTest {
public enum Status{
@Description("进行中")
a,
@Description("成功")
b,
@Description("失败")
c,
}
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.ANNOTATION_TYPE,ElementType.FIELD})
@interface Description{
String value() default "";
}
public static void main(String[] args) throws Exception {
System.out.println(getDescription(Status.a.ordinal(),Status.class));
System.out.println(getDescription(Status.a.name(),Status.class));
}
/**
* 返回枚举字段的中文注解
* @param ordinal 枚举常量的序数
* @param clazz 枚举实例
* @return 注解的value值
* @throws Exception
*/
public static String getDescription(int ordinal,Class<?> clazz) throws Exception {
Status[] values = Status.values();
//通过反射取得枚举中对应的枚举常量
Object obj = ((Object[])(clazz.getMethod("values").invoke(clazz)))[ordinal];
//取得枚举常量的名字
String name=obj.getClass().getMethod("name").invoke(obj).toString();
if (name==null){
return "";
}
//取得对应的枚举字段
Field field=clazz.getField(name);
//取得注解类实例
Description description = field.getAnnotation(Description.class);
if (description==null){
return name+":description if \"\"";
}
return description.value();
}
/**
* 返回枚举字段的中文注解
* @param enumName 枚举常量名
* @param clazz 枚举实例
* @return 注解的value值
* @throws Exception
*/
public static String getDescription(String enumName,Class<?> clazz) throws Exception {
if (enumName==null){
return "";
}
String name=enumName.toString();
Field field=clazz.getField(name);
Description description = field.getAnnotation(Description.class);
if (description==null){
return name+":description if \"\"";
}
return description.value();
}
}