需求
需要获取实体对象的属性及属性值作为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);
}