Android学习之——项目中的反射学习

        这周终于开始了公司项目的上手工作啦,接手了项目的两个功能。大的框架,同事已经全部写好了,需要做的就是往两个功能里填代码就行了。不过本着强烈的学习精神,还是把全部的源代码阅读了一遍,项目功能虽然不是很大,但是涉及的东西还是相当多的。
        首先,整个APP的布局,显示效果采用的是牛逼哄哄的SlidingMenu来做的,这个的源代码读起来就太困难了,木有读。不过当初前同事*就花了一个礼拜的时间阅读完了,小弟佩服膜拜。服务器端采用WebService,因为是医院项目,所以不涉及HTTP协议之类的,只需要在局域网内部署就可以了。数据库采用公司传统SQLServer。
        这个项目的难点主要在服务端部分方法返回值提供的是DataTable类型的,由于Java好像木有Datatable,所以需要重写服务端方法采用xml来返回数据。
        还有就是在提交数据到数据库时,有时候提交的也是Datatable,在android这边需要将数据放到类中,类放到List中,List解析成xml格式,服务端需要将xml格式转换成Datatable形式,听起来还是蛮复杂的。
        当然,上面这些问题同事已经大部分都完成了,我需要做的,就是讲把需要操作的数据,稳妥的放到类中,类放到List中............
        嗯,进入正题,下面的内容就是将项目中我需要学习的知识整理出来,具体到应该会分为几篇博文来记录。

这篇主要是关于反射在项目中的一些用法,给罗列了出来。
关于反射可以参考这篇文章:http://blog.csdn.net/annaleeya/article/details/8240510 讲解的真的是相当的到位。

一、利用反射确定是否关闭对话框
/**
 * 利用反射确定是否关闭对话框
 * 
 * @param dialog
 * @param close
 *            false:不关闭;true:关闭
 */
public void closeDialog(final DialogInterface dialog, boolean close) {
    // 利用反射使点击按钮时,对话框不会关闭
    try {
        // 得到AlertDialog的父类属性mShowing
        field = dialog.getClass().getSuperclass()
                .getDeclaredField("mShowing");
        field.setAccessible(true);
        // 将mShowing变量设为false,表示对话框已关闭
        field.set(dialog, close);
        dialog.dismiss();
    } catch (NoSuchFieldException e) {
        e.printStackTrace();
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }
}
二、反射相关:
    a. 通过反射得到cla类的属性列表
/**
 * 得到cla类的属性列表
 * 
 * @param cla
 *            要反射的类
 * @return
 */
@SuppressWarnings("rawtypes")
public List<String> getPropertyNames(Class cla) {
    List<String> list = new ArrayList<String>();
    Field[] fs = cla.getDeclaredFields();
    // fs=cla.getFields();加了这个的话就只获得public 公有的
    for (Field f : fs) {
        list.add(f.getName());
    }
    return list;
}
    b. 通过反射得到与属性列表相对应的属性值列表
/**
 * 得到与属性列表相对应的属性值列表
 * 
 * @param shuxingList
 *            属性列表
 * @param obj
 *            实体类
 * @return 与属性对应的属性值列表
 * @throws NoSuchFieldException
 * @throws SecurityException
 * @throws IllegalAccessException
 * @throws IllegalArgumentException
 */
@SuppressWarnings({ "rawtypes", "unchecked" })
public List getValueList(List<String> shuxingList, Object obj) {
    List valueList = null;
    try {
 
        Class cla = obj.getClass();
        valueList = new ArrayList();
        for (int i = 0; i < shuxingList.size(); i++) {
            Field f = cla.getDeclaredField(shuxingList.get(i).toString());
            f.setAccessible(true);// 加了这句才能改私有的值
            // 得到属性值
            Object str = f.get(obj);
            valueList.add(str);
        }
    } catch (IllegalArgumentException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (NoSuchFieldException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return valueList;
} 
   c. 通过反射将obj类的属性列表一个个赋值
/**
 * 将obj类的属性列表一个个赋值
 * 
 * @param obj
 *            要反射的类
 * @param propertyNames
 *            类的属性列表
 * @param propertyVales
 *            与属性相对应的属性值列表
 * @throws SecurityException
 * @throws NoSuchFieldException
 * @throws IllegalArgumentException
 * @throws IllegalAccessException
 */
@SuppressWarnings("rawtypes")
public void method(Object obj, List<String> propertyNames,
        List propertyVales) {
    try {
        Class cla = obj.getClass();
        for (int i = 0, len = propertyNames.size(); i < len; i++) {
            // Log.i("propertyNames"+i, propertyNames.get(i)+"");
            Field f = cla.getDeclaredField(propertyNames.get(i).toString());
            f.setAccessible(true);// 加了这句才能改私有的值
            f.set(obj, propertyVales.get(i));
        }
    } catch (IllegalArgumentException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (NoSuchFieldException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
    d. 通过反射得到字段名称
public String[] GetFiled(Object object) {
    Class<? extends Object> cla = object.getClass();
    Field[] fs = cla.getDeclaredFields();
    String[] fields = new String[fs.length];
    for (int i = 0; i < fs.length; i++) {
        // Log.i("propertyNames"+i, propertyNames.get(i)+"");
        fields[i] = fs[i].getName();
    }
    return fields;
 
}
    e. 通过反射给obj类的单个属性赋值
/**
 * 给obj类的单个属性赋值
 * 
 * @param obj
 *            要反射的类
 * @param shuXing
 *            要赋值的属性
 * @param value
 *            要给属性赋予的值
 * @throws SecurityException
 * @throws NoSuchFieldException
 * @throws IllegalArgumentException
 * @throws IllegalAccessException
 */
public void method(Object obj, String shuXing, Object value)
        throws SecurityException, NoSuchFieldException,
        IllegalArgumentException, IllegalAccessException {
    @SuppressWarnings("rawtypes")
    Class cla = obj.getClass();
    Field f = cla.getDeclaredField(shuXing);
    // 加了这句才能改私有的值
    f.setAccessible(true);
    // 为属性赋值
    f.set(obj, value);
}
    f. 通过反射对类进行解析并赋值
/**
 * 对类解析并赋值
 * 
 * @param documentElement
 * @param object
 * @return
 * @throws NoSuchFieldException
 * @throws IllegalAccessException
 * @throws InstantiationException
 * @throws ClassNotFoundException
 */
public Object useFanSheToData(SoapObject documentElement, Object object,String entityname)
        throws NoSuchFieldException, IllegalAccessException,
        InstantiationException, ClassNotFoundException {
    // 利用反射给类赋值
    FanShe fanShe = new FanShe();
    // 存放类的属性
    List<String> classFileList = new ArrayList<String>();
    // 存放类的属性值
    List<Object> classValueList = new ArrayList<Object>();
    // 得到类反射类的属性名称
    Object obj = null;
    // 得到数据的key和value
    for (int i = 0; i < documentElement.getPropertyCount(); i++) {
 
        PropertyInfo propertyInfo = new PropertyInfo();
 
        documentElement.getPropertyInfo(i, propertyInfo);
 
        String propertyName = propertyInfo.getName();
        // System.out.println(propertyName);
        if (documentElement.getProperty(propertyName).toString()
                .startsWith("anyType")) {
            if (documentElement.getProperty(propertyName).toString()
                    .equals("anyType{}")) {
                classFileList.add(propertyName);
                classValueList.add("");
            } else {
                obj = useFanSheToData(
                        (SoapObject) documentElement
                                .getProperty(propertyName),
                        Class.forName(entityname + propertyName)
                                .newInstance(),entityname);
                classFileList.add(propertyName);
                classValueList.add(obj);
            }
        } else {
            classFileList.add(propertyName);
            classValueList.add(documentElement.getProperty(propertyName)
                    .toString());
        }
 
    }
    fanShe.method(object, classFileList, classValueList);
    return object;
}


Mr.傅:学习笔记
欢迎转载,转载注明出处,谢谢


Android学习之——项目中的反射学习,布布扣,bubuko.com

Android学习之——项目中的反射学习

上一篇:Java计算手机九宫格锁屏图案连接9个点的方案总数


下一篇:深入解读ESB与SOA的关系