Android利用反射機制為實體類屬性賦值


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM