但行好事  莫问前程

利用java反射和java自定义注解验证数据的完整性

JDK1.5及以后版本引入的java自定义注解,可以应用到反射中,比如自己写个小框架。如实现实体类某些属性不自动赋值,或者验证某个对象属性完整性等,下面具体说说使用注解对实体数据进行非空校验的过程。

1. 首先自定义非空注解NotEmpty如下:

package org.light4j.annotation;

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 NotEmpty {
}

2. 其次定义一个实体类Person,并在部分属性上面加上注解@NotEmpty如下:

package org.light4j.annotation;

public class Person {
    @NotEmpty
    private Integer id;
    @NotEmpty
    private int age;
    @NotEmpty
    private String name;
    @NotEmpty
    private String sex;
    private String address;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}

3. 编写测试类Main如下:

package org.light4j.annotation;

import java.lang.reflect.Field;

public class Main {
    public static void main(String[] args) {
        try {
            Person person = new Person();
            person.setId(1);
            person.setAge(50);
            person.setName("张三");
            person.setAddress("北京");
            validateParam(person);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 验证数据完整性
     * 
     * @param person
     * @throws Exception
     */
    public static void validateParam(Person person) throws Exception{
        Class<?> personClass = (Class<?>)person.getClass();
        Field[] field = personClass.getDeclaredFields();

        for (int i = 0; i < field.length; i++) {
             Field f= field[i];
             f.setAccessible(true);
            if (f.getAnnotation(NotEmpty.class)!= null) {
                Object attrValue=f.get(person);
                if(attrValue==null||attrValue.toString().endsWith("")){
                    //throw new RuntimeException(f.getName()+"属性值不能为空");
                    System.out.println(f.getName()+"属性值不能为空");
                }
                continue;
            }
        }
    }
}

4. 测试结果截图如下所示:

1

打赏
欢迎关注人生设计师的微信公众账号
公众号ID:longjiazuoA

未经允许不得转载:人生设计师 » 利用java反射和java自定义注解验证数据的完整性

分享到:更多 ()

人生设计师-接受不同的声音

联系我关于我