通过反射动态获取类中字段

353 阅读1分钟

通过反射动态获取类中字段

import java.lang.reflect.Field;

class User {
    private String name;
    private int age;
    private String addr;

    public User() {
    }

    public User(String name, int age, String addr) {
        this.name = name;
        this.age = age;
        this.addr = addr;
    }

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

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

    public String getAddr() {
        return addr;
    }

    public void setAddr(String addr) {
        this.addr = addr;
    }

}

public class TestCase {

    /*
     *  需求如下
     *  若name不为null,则user对象其他所有字段不能为null
     *  若name为null,则user对象其他字段不做验证
     *
     *  通过反射获取类中所有字段
     */

    public static void main(String[] args) 
            throws IllegalAccessException, 
            NoSuchFieldException, 
            InstantiationException {
        User user1 = new User("1", 10, "fds");
        boolean checkResult = check(user1);
        System.out.println(checkResult);
        User user2 = new User();
        user2.setName("2");
        boolean checkResult2 = check(user2);
        System.out.println(checkResult2);
        User user3 = new User();
        boolean checkResult3 = check(user3);
        System.out.println(checkResult3);
    }

    public static boolean check(User user) 
            throws NoSuchFieldException, 
            IllegalAccessException, 
            InstantiationException {
        String name = user.getName();
        if (null != name) {
            Class clz = user.getClass();
            /*
                getDeclaredFields() 获取类中所有Filed,不含父类
                getFields() 获取类中所有public Filed,含父类
             */
            Field[] fieldList = clz.getDeclaredFields();
            for (Field field : fieldList) {
                String fieldName = field.getName();
                Field f = clz.getDeclaredField(fieldName);
                f.setAccessible(true);
                Object o = f.get(user);
                if (o == null) {
                    return false;
                }
            }
        }
        return true;
    }


}