ReflectResolveXML.java
package com.player.handle;
import java.lang.reflect.Field;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.Date;
import java.util.Stack;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class ReflectResolveXML extends DefaultHandler {
public static final String T_COLLECTION="collection";
public static final String T_OBJECT="object";
public static final String T_LANG="lang";
private static final String T_DATE = "date";
private static final String D_PATTERN = "yyyy-MM-dd HH:mm:ss";
Stack<Object> stack=new Stack<Object>();
private Object root=null;
public Object getRoot() {
return root;
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
// System.out.println("endElement:"+uri+" localName:"+localName+ " qName:"+qName);
if (qName.equals(T_OBJECT)||qName.equals(T_COLLECTION)) {
//如果集合类或者object类 属性注入完成则需要弹出堆栈
stack.pop();
}
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
// TODO Auto-generated method stu
StringBuffer stb=new StringBuffer();
for (int i = 0; i < attributes.getLength(); i++) {
stb.append(attributes.getValue(i)+"---") ;
}
System.out.println("startElement:"+uri+" localName:"+localName+ " qName:"+qName+" Attr: "+stb.toString());
//如果根元素为null 则新建一个 因为第一个读取的必定是根元素
String type=attributes.getValue("type");
if (root==null) {
root=instanceObjectByType(type);
stack.push(root);
return;
}
String value=attributes.getValue("value");
String name=attributes.getValue("name");
Object pObj=stack.peek();
//根元素不为空 则根据 qname判断
if (qName.equals(T_COLLECTION)||qName.equals(T_OBJECT)) {
//如果是list则new 一个list 或者 object 则new出来
Object obj=instanceObjectByType(type);
stack.push(obj);
injectToParent(pObj, obj,name);
}else if (qName.equals(T_LANG)) {
//如果是lang 则需要转化value值
Object valueObj=typeConvert(type, value);
injectToParent(pObj,valueObj,name);
}else if (qName.equals(T_DATE)) {
//如果是date
String pattern=attributes.getValue("pattern");
if (pattern==null) {
pattern=D_PATTERN;
}
Object valueObj=typeConvertDate(value,pattern);
injectToParent(pObj,valueObj,name);
}
}
//转化date类型
private Date typeConvertDate( String value, String pattern) {
SimpleDateFormat sdf=new SimpleDateFormat(pattern);
Date date;
try {
date = sdf.parse(value);
return date;
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
//向上一级元素中注入属性 或者向集合类中add子元素
private void injectToParent(Object pObj, Object fieldValue ,String fieldName) {
if (pObj instanceof Collection) {
//如果上一级是集合类 则需要添加进去
((Collection) pObj).add(fieldValue);
return ;
}
//如果上一级是object 则需要反射字段赋值
Field[] fields = pObj.getClass().getDeclaredFields();
for (Field field : fields) {
if (field.getName().equals(fieldName)) {
try {
field.setAccessible(true);
field.set(pObj, fieldValue);
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
break;
}
}
}
//反射实例化对象
private Object instanceObjectByType(String qName) {
try {
Class localClass= Class.forName(qName);
Object obj=localClass.getConstructor().newInstance();
return obj;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
throw new RuntimeException(e);
}
}
// 此方法用于将一个字符串转换为相应的数据类型
public Object typeConvert(String className, String value) {
if (className.equals("java.lang.String")) {
return value;
} else if (className.equals("java.lang.Integer")) {
return Integer.valueOf(value);
} else if (className.equals("java.lang.Long")) {
return Long.valueOf(value);
} else if (className.equals("java.lang.Boolean")) {
return Boolean.valueOf(value);
} else if (className.equals("java.lang.Float")) {
return Float.valueOf(value);
} else if (className.equals("java.lang.Double")) {
return Double.valueOf(value);
} else
return null;
}
}
reflect.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<collecton type="java.util.ArrayList">
<object type="com.player.module.Resource">
<lang type="java.lang.String" name="id" value="0001"></lang>
<object type="com.player.module.Mp3" name="mp3">
<lang type="java.lang.String" name="mp3Name" value="天地初开的时候.mp3"></lang>
<lang type="java.lang.Integer" name="mp3Size" value="12333"></lang>
</object>
<object type="com.player.module.Lrc" name="lrc">
<lang type="java.lang.String" name="lrcName" value="天地初开的时候.lrc"></lang>
<lang type="java.lang.Integer" name="lrcSize" value="4312"></lang>
</object>
<date type="java.util.Date" name="date" value="2001-12-12 12:12:12"></date>
</object>
<object type="com.player.module.Resource">
<lang type="java.lang.String" name="id" value="0002"></lang>
<object type="com.player.module.Mp3" name="mp3">
<lang type="java.lang.String" name="mp3Name" value="那一曲盛放的玫瑰.mp3"></lang>
<lang type="java.lang.Integer" name="mp3Size" value="12333"></lang>
</object>
<object type="com.player.module.Lrc" name="lrc">
<lang type="java.lang.String" name="lrcName" value="那一曲盛放的玫瑰.lrc"></lang>
<lang type="java.lang.Integer" name="lrcSize" value="4312"></lang>
</object>
<date type="java.util.Date" name="date" value="2001-12-13 12:12:12"></date>
</object>
</collecton>
HandleTest.java
package com.player.handle;
import java.io.File;
import java.io.IOException;
import java.util.List;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.junit.Test;
import org.xml.sax.SAXException;
import com.player.module.Resource;
public class HandleTest {
@Test
public void testresolveXmlTest() throws ParserConfigurationException, SAXException, IOException{
// HttpDownloader downloader=new HttpDownloader();
// String xml= downloader.download(Mp3ListActiviy.URL);
File file=new java.io.File("D:\\Soft\\Program\\Apache-Tomcat-6.0.20\\webapps\\android_mp3\\reflect.xml");
SAXParser saxParser=SAXParserFactory.newInstance().newSAXParser();
ReflectResolveXML reflectResolveXML=new ReflectResolveXML();
saxParser.parse(file, reflectResolveXML);
List<Resource> resources=(List<Resource>) reflectResolveXML.getRoot();
System.out.println("---------------------");
for (Resource resource : resources) {
System.out.println(resource.toString());
}
//mp3xmlHandle.getMp3List();
}
}
三个javabean
public class Lrc {
private String lrcName;
private Integer lrcSize;
}
public class Mp3 {
private String mp3Name;
private int mp3Size;
}
public class Resource {
private String id;
private Mp3 mp3;
private Lrc lrc;
private Date date;
}
分享到:
相关推荐
在Android开发中,获取系统内存信息以及保存和解析XML文件是常见的操作,这些功能对于优化应用性能、存储数据以及与其他应用或服务器交换信息至关重要。以下将详细介绍这两个知识点,并提供一个简单的示例。 首先,...
在Android系统中,Java反射机制同样被广泛应用,尤其是在动态加载类、处理不确定类型的对象、调用私有方法或者访问私有变量等方面。下面将深入探讨Java反射机制的概念、原理及在Android开发中的应用。 一、Java反射...
- 使用DOM4J解析XML文件,你可以创建一个XML文档,添加元素、属性,甚至执行XPath查询来检索数据。 - 使用Fastjson解析JSON字符串,你可以快速地将JSON转换为Java对象,如Map、List或其他自定义类,反之亦然。 ...
"Android Pull解析Demo"就是这样一个示例,它展示了如何利用Android系统内置的Pull解析器(PullParser)来解析XML文档,同时结合Java的反射机制,动态地获取类中的变量值。下面我们将深入探讨这两个关键知识点。 **...
在Android开发中,XML文件常用于存储数据或配置信息,而`XmlUtils`工具类则提供了方便的方法来解析XML文件并将其转换为Java对象。这个工具类不是Android SDK自带的,通常是由开发者自定义实现的,例如提供的示例代码...
为了提高软件的灵活性、可扩展性和自适应能力,本文介绍了一种基于Java反射机制的方法,用于解析XML数据,并将其封装为JavaBean对象,以便Android应用程序能够更高效地处理来自Web服务的数据。 #### 二、Java反射...
这个工具可能提供了一种便利的方式,允许开发者只需提供JavaBean的类名和XML相关参数,即可自动解析XML数据并填充到对应的Java对象中。这种映射过程通常基于Java的反射API,它允许程序在运行时检查类的信息,如方法...
要从Java环境中解析APK文件,通常需要特定的工具和库,本话题将详细探讨如何利用Java来解析APK,以及相关的关键知识点。 首先,我们需要理解APK的结构。一个APK文件实际上是一个ZIP格式的压缩包,包含以下几个核心...
将这个库导入到你的Java项目中,可以使用反射等技术调用其内部的方法来读取APK文件的元数据。 以下是一些关键步骤: 1. **读取APK文件**:使用Java的`java.util.zip`包,如`ZipFile`类,打开并遍历APK文件的ZIP...
`handleJsCall()`方法会解析URL,提取出JavaScript调用的Java方法名和参数,然后执行相应的Java方法。这里需要一个桥梁函数来执行实际的Java操作: ```java private void handleJsCall(String jsUrl) { String ...
Java学习助手是一款面向Java初学者和安卓开发者的应用,它为用户提供了一...通过Java学习助手,用户可以系统地学习和实践这些知识点,逐步提升自己的编程技能,为成为合格的Java程序员或Android开发者打下坚实的基础。
- **界面布局**:学习XML布局文件的设计,掌握LinearLayout、RelativeLayout等常见布局。 - **Activity与Fragment**:理解Activity生命周期,学会在不同页面间传递数据。 - **数据存储**:了解SharedPreferences、...
其工作原理是通过反射机制来解析和构建对象,使得开发者可以快速地在XML和Java对象之间进行数据交换。 首先,要使用XStream,需要将其引入到Android项目中。在`build.gradle`文件中添加依赖: ```groovy ...
DOM解析器提供了一种基于树的数据结构来存储XML文档,而SAX解析器则是事件驱动的,适用于处理大型XML文件。 4. **加密与安全** Libcore包含了Java Cryptography Architecture (JCA) 和 Java Cryptography ...
例如,你可以使用`java -jar AXMLPrinter2.jar your_file.xml > output.txt`这样的命令来解析XML文件。 2. **AXMLPrinter.jar**:这是AXMLPrinter的早期版本,功能与AXMLPrinter2类似,但可能在某些特性或性能上...
此外,AndroidManifest.xml是Android应用的重要配置文件,其中包含了应用的基础信息、权限声明、服务、广播接收器等。在数据库访问接口的实现中,我们可能需要在此处声明所需的权限,如读写数据库的权限。而res...
TangibleXML 是一个 Android 库,它通过注解和反射自动将 XML 解析为方便的对象。 通过注释的强大功能,它真的很容易使用。 TangibleXML 的灵感来自 Alex Gilleran 的 IceSoap(实际上是它的介绍文档),它对于我...
- LayoutInflater用于根据XML布局文件实例化视图。 - **关键方法**: - `inflate(int resource, ViewGroup root, boolean attachToRoot)`: 加载布局。 - **LocalBroadcastManager源码解析** - ...