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