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