跟王老师学注解:注解应用案例

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了跟王老师学注解:注解应用案例相关的知识,希望对你有一定的参考价值。

跟王老师学注解(六):注解应用案例

主讲教师:王少华   QQ群号:483773664

一、需求

利用注解,做一个Bean的数据校验

要求:

用户名是否能为空,用户名的长度不能超过指定长度,不能少于指定长度

二、参考代码

@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.FIELD, ElementType.PARAMETER })
public @interface MyValidate {
    // 是否可以为空
    boolean nullable() default false;
 
    // 最大长度
    int maxLength() default 0;
 
    // 最小长度
    int minLength() default 0;
 
    // 参数或者字段描述,这样能够显示友好的异常信息
    String description() default "";
}
public class User {
    @MyValidate(description="用户名",minLength=6,maxLength=32,nullable=false)
    private String userName;
    public User(String userName) {
        super();
        this.userName = userName;
    }
}
public class ValidateService {
    // 解析的入口
    public static void valid(Object object) throws Exception {
        // 获取object的类型
        Class<? extends Object> clazz = object.getClass();
        // 获取该类型声明的成员
        Field[] fields = clazz.getDeclaredFields();
        // 遍历属性
        for (Field field : fields) {
            // 对于private私有化的成员变量,通过setAccessible来修改器访问权限
            field.setAccessible(true);
            validate(field, object);
            // 重新设置会私有权限
            field.setAccessible(false);
        }
    }
     
    public static void validate(Field field,Object object) throws Exception{
        String description;
        Object value;
  
        //获取对象的成员的注解信息
        MyValidate dv=field.getAnnotation(MyValidate.class);
        value=field.get(object);
          
        if(dv==null)return;
          
        description=dv.description().equals("")?field.getName():dv.description();
          
        /*************注解解析工作开始******************/
        if(!dv.nullable()){
            if(value==null||value.toString()==""||"".equals(value.toString())){
                throw new Exception(description+"不能为空");
            }
        }
          
        if(value.toString().length()>dv.maxLength()&&dv.maxLength()!=0){
            throw new Exception(description+"长度不能超过"+dv.maxLength());
        }
          
        if(value.toString().length()<dv.minLength()&&dv.minLength()!=0){
            throw new Exception(description+"长度不能小于"+dv.minLength());
        }
          
        /*************注解解析工作结束******************/
    }
}
public class Test {
    public static void main(String[] args) {
        User user = new User("张三");
        try {
            ValidateService.valid(user);
        } catch (Exception e) {
            e.printStackTrace();
        }
        user = new User("zhangsan");
        try {
            ValidateService.valid(user);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}


本文出自 “跟王老师学编程” 博客,请务必保留此出处http://teacherwang.blog.51cto.com/10946447/1787915

以上是关于跟王老师学注解:注解应用案例的主要内容,如果未能解决你的问题,请参考以下文章

跟王老师学注解:自定义注解

跟王老师学注解:注解概述

跟王老师学注解注解的分类及内建注解

跟王老师学注解:利用反射读取注解信息

跟王老师学反射:反射应用小案例--进行对象拷贝

Java注解--一张图一案例掌握自定义注解