在做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對象中的。
