快捷搜索: 王者荣耀 脱发

通过反射获取实体对象的属性及对应的属性值

需求 需要获取实体对象的属性及属性值作为key-value形式的NameValuePair参数,用于post请求的参数,为了避免一大段的get代码,考虑使用反射方式进行设置,示例代码如下:

public class Person {
    private String name;
    private String sex;
    private String phone;

    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 getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }
}

通过反射获取属性及属性值的测试代码如下:

public static void main(String[] args) {
    Person person = new Person();
    person.setName("aaa");
    person.setSex("男");
    person.setPhone("12345566");

    Class clazz = person.getClass();
    // 获取类中声明的字段
    Field[] fields = clazz.getDeclaredFields();
    for (Field field : fields) {
    	// 避免 can not access a member of class com.java.test.Person with modifiers "private"
        field.setAccessible(true);
        try {
            System.out.println(field.getName() + ":"+ field.get(person));
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
}

运行结果:

name:aaa
sex:男
phone:12345566

Field 中 field.get(Object obj) 的源码如下:

/**
 * 返回对象指定field的值
 * @param obj 声明该字段的对象
 */ 
@CallerSensitive
public Object get(Object obj)
    throws IllegalArgumentException, IllegalAccessException {
    if (!override) {
        if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {
            Class<?> caller = Reflection.getCallerClass();
            checkAccess(caller, clazz, obj, modifiers);
        }
    }
    return getFieldAccessor(obj).get(obj);
}

经验分享 程序员 微信小程序 职场和发展