在做android项目时,有时会遇到从网络上获取json类型数据,赋值给实体类,实体类属性少可以一个一个的赋值,如果实体类有很多属性,赋值可能就要耗很长的功夫了,幸好Java给我们提供了反射机制。下面是在我在android中如何利用java反射机制给实体类赋值。
在Android中利用反射机制为实体类属性赋值,首先需要导入一下两个包
import java.lang.reflect.Field;
import java.lang.reflect.Method;
给实体类赋值首先需要一个实体类,这里面我就简单的定义一个学生实体类StudentInfoBean:
public class StudentInfoBean { private int id; private String stuName; private String stuGender; private String stuIdCard; private String stuClass; private String address; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getStuName() { return stuName; } public void setStuName(String stuName) { this.stuName = stuName; } public String getStuGender() { return stuGender; } public void setStuGender(String stuGender) { this.stuGender = stuGender; } public String getStuIdCard() { return stuIdCard; } public void setStuIdCard(String stuIdCard) { this.stuIdCard = stuIdCard; } public String getStuClass() { return stuClass; } public void setStuClass(String stuClass) { this.stuClass = stuClass; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } }
下面定义一个Utils类,在Utils类中定义了一下方法,请看代码:
public class Utils { private static final String TAG = "Utils"; public Object setObjectValue(Object object, String json) throws Exception { if (object == null) return null; Log.d(TAG, "setObjectValue"); Class<?> clazz = object.getClass(); Field[] fields = clazz.getDeclaredFields(); for (Field field : fields) { Log.d(TAG, "field type:" + field.getName());// 打印字段的类型 if (field.getGenericType().toString().equals("class java.lang.String")) { Method method = object.getClass().getMethod("set" + getMethodName(field.getName()), String.class); method.invoke(object, parseJson(json, field.getName())); } if (field.getGenericType().toString().equals("class java.lang.Integer"))// { Method method = object.getClass().getMethod("set" + getMethodName(field.getName()), Integer.class); method.invoke(object, parseJson(json, field.getName())); } } return object; } /** * 解析json * */ private String parseJson(String json_string, String name) { String str = "no info"; JSONObject json; try { json = new JSONObject(json_string); json = json.getJSONObject("studentinfo"); str = json.getString(name); } catch (JSONException e) { e.printStackTrace(); } return str; } /** * 将属性名称的首字母变成大写 * */ public String getMethodName(String fieldName) { byte[] bytes = fieldName.getBytes(); bytes[0] = (byte) (bytes[0] - 'a' + 'A'); return new String(bytes); } }
在上面的代码中定义了一个setObjectValue方法,该方法接收两个参数,第一个是Object类型的参数,在这里面接收的是一个StudentInfoBean对象,第二个参数是String类型的json数据,是填充到StudentInfoBean对象中的。