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)));
}
}