这周终于开始了公司项目的上手工作啦,接手了项目的两个功能。大的框架,同事已经全部写好了,需要做的就是往两个功能里填代码就行了。不过本着强烈的学习精神,还是把全部的源代码阅读了一遍,项目功能虽然不是很大,但是涉及的东西还是相当多的。
首先,整个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.傅:学习笔记
欢迎转载,转载注明出处,谢谢