• 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对象中的。

     
  • 相关阅读:
    通过网格拆分高德地图
    vue-router重定向 不刷新问题
    vue-scroller记录滚动位置
    鼠标滚轮更改transform的值(vue-scroller在PC端的上下滑动)
    position sticky的兼容
    js截图及绕过服务器图片保存至本地(html2canvas)
    禁止页面回退到某个页面(如避免登录成功的用户返回到登录页)
    手动创建script解决跨域问题(jsonp从入门到放弃)
    逻辑回归的常见面试点总结
    听说你不会调参?TextCNN的优化经验Tricks汇总
  • 原文地址:https://www.cnblogs.com/wangpf/p/4190690.html
Copyright © 2020-2023  润新知