`
yangsongjing
  • 浏览: 248387 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论

反射---动态的把对象和list转成xml

阅读更多

首先是对象:
UserBean o = new UserBean();
o.setUId(1);
o.setUName("ysj");
o.setUdesc("男的");
list.add(o);
FileUtil.getValue(UserBean.class,o);

public static <T> List<T> getValue(Class<T> t, Object o)
throws InstantiationException, IllegalAccessException,
IntrospectionException, IllegalArgumentException,
InvocationTargetException {
File file = new File("d:\\test\\a.xml");
Field[] fields = t.getDeclaredFields();
StringBuffer sb = new StringBuffer();
sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
sb.append("<roots>");
for (Field f : fields) {
PropertyDescriptor pd = new PropertyDescriptor(f.getName(),t);
sb.append("<"+f.getName()+">").append(pd.getReadMethod().invoke(o)).append("</"+f.getName()+">");
// 写数据
pd.getWriteMethod().invoke(t.newInstance(), pd.getReadMethod().invoke(o));

}
sb.append("</roots>");
System.out.println(sb);
return null;
}

只要此方法不管对象怎么变都能写入很方便不用因为传入的对象不同而且重载;

下面的就是list:
List<UserBean> list = new ArrayList<UserBean>();
for(int i=0;i<5;i++){
UserBean o = new UserBean();
o.setUId(i);
o.setUName("ysj"+i);
o.setUdesc("男的"+i);
list.add(o);
}

FileUtil.getValue(UserBean.class,list);


import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.NodeList;

public class FileUtil {

public static <T> void setValue(Class<T> t, List<T> list)
throws InstantiationException, IllegalAccessException,
IntrospectionException, IllegalArgumentException,
InvocationTargetException {
File file = new File("d:\\"+ t.getName() +".xml");
Field[] fields = t.getDeclaredFields();
StringBuffer sb = new StringBuffer();
sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
sb.append("<roots>");
for(int i=0;i<list.size();i++){
sb.append("<root>");
for (Field f : fields) {
PropertyDescriptor pd = new PropertyDescriptor(f.getName(),t);
sb.append("<"+f.getName()+">").append(pd.getReadMethod().invoke(list.get(i))).append("</"+f.getName()+">");
// 写数据
// pd.getWriteMethod().invoke(t.newInstance(), pd.getReadMethod().invoke(list.get(i)));
}
sb.append("</root>");
}
sb.append("</roots>");
OutputStream outputStream = null;
try {
outputStream = new FileOutputStream(file);
outputStream.write(sb.toString().getBytes("UTF-8"));
outputStream.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (outputStream != null) {
outputStream.close();
}
} catch (IOException e) {

}
}

System.out.println(sb);
}

public static <T> List<T> getValue(Class<T> t){
String filePath = "d:\\"+ t.getName() +".xml";
List<T> list = new ArrayList<T>();
org.w3c.dom.Document document = null;
Field[] fields = t.getDeclaredFields();
try {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
document = builder.parse(new File(filePath));
if(document == null){
return null;
}
NodeList node = (document).getChildNodes().item(0).getChildNodes();
for(int i = 0;i<node.getLength();i++){
T _t = t.newInstance();
for (Field f : fields) {
PropertyDescriptor pd = new PropertyDescriptor(f.getName(),t);
if(pd.getPropertyType().equals(Integer.TYPE)){

Method method = t.getMethod(pd.getWriteMethod().getName(),int.class);
method.invoke(_t, Integer.parseInt((document).getDocumentElement()
.getElementsByTagName(f.getName()).item(i).getTextContent()));

}else if(pd.getPropertyType().equals(Boolean.TYPE)){

Method method = t.getMethod(pd.getWriteMethod().getName(),boolean.class);
method.invoke(_t, Boolean.parseBoolean((document).getDocumentElement()
.getElementsByTagName(f.getName()).item(i).getTextContent()));

}else{

Method method = t.getMethod(pd.getWriteMethod().getName(),
String.class);
method.invoke(_t, (document).getDocumentElement()
.getElementsByTagName(f.getName()).item(i).getTextContent());
}
}
list.add(_t);
}
} catch (Exception e) {
System.out.println("e-->"+e);
}
return list;
}

}
1
6
分享到:
评论

相关推荐

    java List XMl转换DEMO

    这通常涉及到Java的反射机制,通过分析XML节点来创建和初始化JavaBean对象。以下是一个简单的实现: 1. 解析XML字符串,得到XML的根元素。 2. 遍历XML的子元素,根据元素的标签名创建对应的JavaBean实例。 3. 使用...

    JAVA对象序列化保存为XML文件的工具类

    `XMLEncoder`是一个用于将Java对象编码为XML输出流的类,它能够将对象的属性和结构转换为XML格式。而`XMLDecoder`则相反,它可以解析XML输入流并重建原始的Java对象。这两个工具使得在XML和Java对象之间进行序列化和...

    任意XML转实体类 实体类 转XML 方法 JAVA

    总结一下,XML转实体类和实体类转XML涉及的主要知识点有:Java反射API、XML解析(DOM、SAX、StAX、JAXB),以及对象的序列化和反序列化。在实际开发中,我们需要根据项目需求选择合适的工具和方法,确保数据的准确...

    泛型集合反射保存为xml文件 并可反射读取集合

    在.NET框架中,泛型、XML和反射是三个非常重要的概念,它们在处理数据和对象时发挥着关键作用。在给定的标题和描述中,我们看到这些技术被结合使用,实现了自定义类型集合的XML序列化和反序列化。 首先,让我们了解...

    使用Betwixt将XML转为JAVA Bean(内有JAR包)

    Betwixt基于JavaBeans规范,通过反射和注解来实现XML和Java对象之间的映射。它通过分析Java类的结构来生成XML,或者根据XML的结构来创建Java对象实例。在处理相同节点名的情况下,Betwixt允许我们通过属性名和类型来...

    dom4j解析xml,利用反射机制

    通过这种方式,我们可以利用DOM4J解析XML文件,同时借助Java反射机制将解析结果动态地映射到自定义的Java类中。这在处理XML数据时提供了很大的灵活性,尤其在需要将XML数据与业务对象关联时,反射机制显得尤为重要。

    list输出xml

    在描述中提到,“利用反射和泛型实现了动态导出List到xml”,这意味着代码可能首先创建了一个List对象,其中包含了各种类型的实例。通过反射,程序可以访问这些对象的属性,获取它们的值,然后使用DOM4J将这些值转化...

    java反射,Digester解析xml文档

    总结来说,Java反射提供了在运行时动态操作类和对象的能力,而Digester则是简化XML到Java对象映射的工具。两者结合使用,可以在程序运行过程中根据XML配置动态地创建和配置对象,增强了Java代码的灵活性和可扩展性。...

    使用XStream是实现XML与Java对象的转换(4)--转换器

    在Java开发中,数据序列化和反序列化是一项常见的任务,它允许我们将对象的状态转换为持久化的格式(如XML或JSON),以便存储或传输。XStream是一个强大的库,专门用于XML与Java对象之间的互相转换。这篇博文将深入...

    使用xstream进行java类与xml文件互转解析--代码

    为了将一个Java对象转换成XML,首先需要创建该对象实例,然后使用XStream的`toXML()`方法: ```java import com.thoughtworks.xstream.XStream; public class Person { private String name; private int age; ...

    ResultSet转化为json,json转化为List

    ResultSet是数据库查询结果的载体,JSON是一种轻量级的数据交换格式,而List是Java集合框架中的动态数组。本文将详细介绍如何在Java中将ResultSet转换为JSON,以及如何将JSON转换为List。 首先,我们来探讨如何将...

    反射工厂XML配置无需编译加入功能DEMO

    反射工厂配合XML配置,可以实现动态加载和管理类,从而在不重新编译代码的情况下添加新功能,提高软件的灵活性和可扩展性。本DEMO将深入探讨如何利用反射和XML配置来实现这一目标。 首先,让我们了解什么是反射。在...

    Xstream的xml转换

    它通过反射和类型安全的转换来实现对象到XML的转换,以及从XML到对象的还原。在转换过程中,Xstream会根据对象的字段和属性创建XML元素和属性。通过使用自定义的转换器,你可以控制这个过程,以便处理特定类型的对象...

    根据XML配置文件自动生成窗体控件

    反射是.NET框架提供的一种强大功能,允许运行时检查类型信息,并能动态地创建对象和调用方法。在本项目中,程序会读取`FormConfig.xml`,解析XML中的控件定义,然后通过反射找到对应的控件类型,并实例化这些控件。...

    XStream使用方法总结-对象-转换.txt

    它通过反射机制来读取对象的信息,并将其转化为XML格式,反之亦然。XStream提供了丰富的API接口,使得开发者能够轻松地定制转换规则,支持各种复杂的Java对象结构。 #### 二、基本使用 1. **创建XStream实例** ...

    xStream xml to bean

    xStream的核心思想是通过反射和类型映射来实现对象与XML之间的转换。它使用一种称为“annoation”的机制,允许开发者自定义XML的元素和属性名,以匹配Java对象的字段。这样,即使Java对象的结构复杂,xStream也能...

    各种对象转成JSON字符串.pdf

    - `xom-1.0.jar`: XML对象模型库,可能用于XML和JSON之间的转换。 以上就是`JSONUtil`类的主要工作原理和相关知识点,通过这个工具类,开发者可以在Java应用中方便地将各种类型的对象转换为JSON字符串,便于数据...

    C#对象与XMl文件之间的相互转换

    使用XmlSerializer的优点在于它不需要对象实现特定的接口,如ISerializable,而是直接通过反射分析对象的属性和字段来生成XML。 2. **序列化过程**:要使用XmlSerializer进行序列化,首先需要创建一个XmlSerializer...

    dom4J生成xml、解析xml、生成xml文件实例

    - **保存XML**:最后,使用`Document`对象的`asXML()`方法将XML结构转换成字符串,再写入文件。 例如,`CreateXml.java`可能包含以下代码片段: ```java DocumentFactory factory = DocumentFactory.getInstance()...

Global site tag (gtag.js) - Google Analytics