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