package jyl.mix.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @Target 表示该注解应用的目标
* 支持方法METHOD、属性FIELD等10种类型(java1.8)
* @Retention 表示注解的生存期
* SOURCE 仅存在源文件,如Override
* CLASS 在生成的class文件也存在,但运行时jvm不会加载,不会对程序运行产生影响
* RUNTIME 程序运行过程会加载该注解,会对程序的运行产生影响
* @Inherited 表示该注解是可继承的,若父类有此注解,则子类默认拥有该注解
* @Documented 表示该注解会出现在生成的javadoc中
*
* 本注解可用于参数校验
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface ValidEnum {
String valid() default "";
String errMsg() default "invalid value!";
}
package jyl.mix.annotation;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.List;
class Sex {
@ValidEnum(valid = "男,女,male,female")
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Sex{name=" +
this.getName() +
"}";
}
}
public class TestEnum {
/**
* 通过反射获取注解内容
* @param sex
* @throws NoSuchMethodException
* @throws InvocationTargetException
* @throws IllegalAccessException
*/
private static void checkSex(Sex sex)
throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
Class<?> clazz = sex.getClass();
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
if (field.isAnnotationPresent(ValidEnum.class)) {
ValidEnum validEnum = (ValidEnum) field.getAnnotation(ValidEnum.class);
List valids = Arrays.asList(validEnum.valid().split(","));
String fieldName = field.getName();
String getterMethodName = "get" +
fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
Method method = clazz.getMethod(getterMethodName);
Object obj = method.invoke(sex);
if (valids.contains(obj.toString())) {
System.out.println(sex.toString());
System.out.println("valid");
} else {
System.out.println(sex.toString());
System.out.println(validEnum.errMsg());
}
}
}
}
public static void main(String[] args)
throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
Sex sex = new Sex();
sex.setName("男");
checkSex(sex);
sex.setName("1");
checkSex(sex);
}
}