import java.lang.reflect.Field;
import java.util.Date;
public class ParserUtil {
/**
*
* @param field 属性
* @param value 值
* @return 返回相应类型
* @throws Exception
*/
public static Object getArgus(Field field, String value) throws Exception {
Object obj = null;
if (field.getGenericType().toString().equals("class java.lang.String")) {
return value;
}
if (field.getGenericType().toString().equals("class java.lang.Integer")) {
return Integer.parseInt(value);
}
if (field.getGenericType().toString().equals("class java.lang.Double")) {
return Double.parseDouble(value);
}
if (field.getGenericType().toString().equals("class java.lang.Boolean")) {
return Boolean.parseBoolean(value);
}
if (field.getGenericType().toString().equals("boolean")) {
return Boolean.parseBoolean(value);
}
if (field.getGenericType().toString().equals("int")) {
return Integer.parseInt(value);
}
if (field.getGenericType().toString().equals("class java.util.Date")) {
return Date.parse(value);
}
if (field.getGenericType().toString().equals("class java.lang.Short")) {
return Short.parseShort(value);
}
return obj;
}
}
import java.io.InputStream;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import org.xmlpull.v1.XmlPullParser;
import android.util.Log;
import android.util.Xml;
public class ReflectParser {
private InputStream is = null;
private ArrayList<Object> list = null;
/**
* 构造方法传参
* @param is 文件输入流
*/
public ReflectParser(InputStream is) {
this.is = is;
}
/**
* @param encoding xml的编码格式
* @param clazz 实体对象的反射
* @return 对象的集合
* @throws Exception XmlPullParserException, InstantiationException, IllegalAccessException, IOException 和所调方法的异常
*/
public List<Object> getObjects(String encoding, Class clazz) throws Exception{
list = new ArrayList<Object>();
XmlPullParser parser = Xml.newPullParser();
parser.setInput(is, encoding);
int event = parser.getEventType();
//声明对象的引用1
Object object = null;
// 获取类名和父标签
String name = clazz.getName();// 2
String root = name
.subSequence(name.lastIndexOf(".") + 1, name.length())
.toString();// 3
while (XmlPullParser.END_DOCUMENT != event) {
switch (event) {
case XmlPullParser.START_TAG:
Log.i("XiMoon", root);
// 当标签为父标签的时候 4
if (root.equalsIgnoreCase(parser.getName())) {
// 创建一个实例5
object = clazz.newInstance();
}
// 设置属性6
getAttribute(object, parser, clazz);
break;
case XmlPullParser.END_TAG:
// 将对象添加到集合中 7
if (root.equalsIgnoreCase(parser.getName())) {
list.add(object);
object = null;
}
break;
default:
break;
}
event = parser.next();
}
return list;
}
/**
* @param object 实例化对象
* @param parser 解析器
* @param clazz 反射
* @throws Exception IllegalAccessException, IllegalArgumentException, XmlPullParserException, IOException, Exception
*/
private void getAttribute(Object object, XmlPullParser parser, Class clazz) throws Exception{
// 获得该类所有公共属性
Field[] fields = clazz.getFields();
for (Field field : fields) {
// 设置相应对象的属性
if (parser.getName().equals(field.getName())) {
field.set(object, ParserUtil.getArgus(field, parser.nextText()));
break;
}
}
}
}
说明:
1.ReflectParser类的作用
构造方法传一个xml文件对应的输入流之后,调用getObject()方法即可解析成相应的一个Object的list集合,其中String encoding 指定文件的编码格式, Class clazz 指定实体的反射 (也可以传实体对象,然后通过getClass()方法获取反射)
2.ParserUtil类的作用
将xml获得的内容解析成实体字段对应的类型并返回
3.获得List<Object>集合之后,通过循环逐个强转为Bean再添加到新定义的List集合中即可
List<JavaBean> newList = new ArrayList<JavaBean>();
JavaBean bean = null;
for (Object object : list) {
bean = (JavaBean)object;
newList.add(bean);
}
注:
1.实体的属性一定用public方法修饰
2.父标签名和实体名一致(忽视大小写区分)
3.子标签名和实体属性名一致(忽视大小写区分)
4.xml文件采用无属性的方式构建(有属性参照以下方法修改代码,root指实体类名或者父标签名,object在解析之前已经声明)
if (root.equalsIgnoreCase(parser.getName())) {
// 创建一个实例
object = clazz.newInstance();//5
// 获取属性数量
count = parser.getAttributeCount();
for (int i = 0; i < count; i++) {
Field f = object.getClass().getField(parser.getAttributeName(i));
// 此处设置值的时候一定要记得转换类型
f.set(object, getArgus(f, parser.getAttributeValue(i)));
}
}