通過反射獲取實體對象的屬性及對應的屬性值

需求
需要獲取實體對象的屬性及屬性值作爲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);
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章