当前位置: 代码迷 >> Android >> Android学习之——(一)项目中的反射学习
  详细解决方案

Android学习之——(一)项目中的反射学习

热度:86   发布时间:2016-04-28 06:32:20.0
Android学习之——(1)项目中的反射学习
        这周终于开始了公司项目的上手工作啦,接手了项目的两个功能。大的框架,同事已经全部写好了,需要做的就是往两个功能里填代码就行了。不过本着强烈的学习精神,还是把全部的源代码阅读了一遍,项目功能虽然不是很大,但是涉及的东西还是相当多的。
        首先,整个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 讲解的真的是相当的到位。

一、利用反射确定是否关闭对话框
Field field;
/** * 利用反射确定是否关闭对话框 *  * @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.傅:学习笔记
欢迎转载,转载注明出处,谢谢


  相关解决方案