自定义注解使用,及通过反射使用注解
通过反射获取变量注解的赋值,及原注解的量值,来进行相应的处理。
注解可以实现对变量的赋值、及控制
实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User1 {
private String userName;
@ValidateAge(min = 20, max = 35, value = 22)
private int age;
// @InitSex(sex = InitSex.SEX_TYPE.MAN)
@InitSex()
private String sex;
}
自定义注解 性别
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD,ElementType.METHOD})
@Inherited
public @interface InitSex {
enum SEX_TYPE {MAN, WOMAN}
SEX_TYPE sex() default SEX_TYPE.MAN;
}
自定义注解 年龄控制
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.METHOD})
@Inherited
public @interface ValidateAge {
/**
* 最小值
*/
int min() default 18;
/**
* 最大值
*/
int max() default 99;
/**
* 默认值
*/
int value() default 20;
}
使用反射来解析控制自定义注解
// 初始化性别
private void initUser(User1 user) throws IllegalAccessException {
// 获取User类中所有的属性(getFields无法获得private属性)
Field[] fields = User1.class.getDeclaredFields();
// 遍历所有属性
for (Field field : fields) {
// 如果属性上有此注解,则进行赋值操作
if (field.isAnnotationPresent(InitSex.class)) {
InitSex init = field.getAnnotation(InitSex.class);
field.setAccessible(true);
// 设置属性的性别值
field.set(user, init.sex().toString());
System.out.println("完成属性值的修改,修改值为:" + init.sex().toString());
}
}
}
// 年龄注解检验
private boolean checkUser(User1 user) throws IllegalAccessException {
// 获取User类中所有的属性(getFields无法获得private属性)
Field[] fields = User1.class.getDeclaredFields();
boolean result = true;
// 遍历所有属性
for (Field field : fields) {
// 如果属性上有此注解,则进行赋值操作
if (field.isAnnotationPresent(ValidateAge.class)) {
ValidateAge validateAge = field.getAnnotation(ValidateAge.class);
field.setAccessible(true);
int age = (int) field.get(user);
if (age < validateAge.min() || age > validateAge.max()) {
result = false;
System.out.println("年龄值不符合条件");
}
}
}
return result;
}
单元测试
第一次年龄为0,checkUser 失败
第二次年龄设25,checkUser成功
@Test
public void test10() throws IllegalAccessException {
User1 user1 = new User1();
// 初始化性别
initUser(user1);
System.out.println(user1);
// 年龄校验
boolean b = checkUser(user1);
System.out.println(b);
user1.setAge(25);
// 年龄校验
boolean c = checkUser(user1);
System.out.println(c);
}
打印结果
完成属性值的修改,修改值为:MAN
User1(userName=null, age=0, sex=MAN)
年龄值不符合条件
false
true