`

通过JAVA反射机制与DOM4J来实现持久化JAVA对象

阅读更多
一个接口ReadWriteInt ,一个实现类ReadWriteIntImp ,代码如下:

package com.netunit.workbench.util;   
  
import java.io.IOException;   
import java.util.List;   
  
/**  
 * 读写XML接口  
 * @author Ming.He  
 *  
 * @Data 2009-12-21  
 */  
public interface ReadWriteInt {   
  
    /**  
     * 把数据写入xml文件  
     * @param list  
     * @param cls  
     * @throws IOException  
     */  
    public void writeXML(List list, Class cls) throws IOException;   
       
    /**  
     * 把数据重xml读出来  
     * @param cls  
     * @return  
     * @throws Exception  
     */  
    public List readXML(Class cls) throws Exception;   
} 




package com.netunit.workbench.util;   
  
import java.io.File;   
import java.io.FileWriter;   
import java.io.IOException;   
import java.lang.reflect.Field;   
import java.lang.reflect.Method;   
import java.util.ArrayList;   
import java.util.Iterator;   
import java.util.List;   
  
import org.dom4j.Document;   
import org.dom4j.DocumentHelper;   
import org.dom4j.Element;   
import org.dom4j.io.OutputFormat;   
import org.dom4j.io.SAXReader;   
import org.dom4j.io.XMLWriter;   
  
/**  
 * 读写XML的实现  
 * @author Ming.He  
 *  
 * @Data 2009-12-21  
 */  
public class ReadWriteIntImp implements ReadWriteInt {   
  
    /**  
     * 文件名  
     */  
    private File file ;   
    /**  
     * 设置编码  
     */  
    private String encoding = "GBK";   
       
    private String roots = "root";   
       
    public ReadWriteIntImp(File file) {   
        this.file = file;   
    }   
       
    public void writeXML(List list, Class cls) throws IOException{   
        String className = cls.getName();   //类名包含包名   
        String classes = className.substring(className.lastIndexOf(".")+1,className.length());//类名   
        XMLWriter writer = null;        // 声明写XML的对象   
        OutputFormat format = OutputFormat.createPrettyPrint();   
        format.setEncoding(encoding);   // 设置XML文件的编码格式   
        Document document = DocumentHelper.createDocument();   
        Element root = document.addElement(roots);//根节点   
        Element two = root.addElement(classes+"s");   
        two.addAttribute("class", className);   
        Element three = null;   
        for (int i=0;i<list.size();i++){   
            three = two.addElement(classes);   
            insert(three,list.get(i),cls);   
        }   
        writer = new XMLWriter(new FileWriter(file), format);   
        writer.write(document);   
        writer.close();   
    }   
       
    private void insert(Element three,Object object,Class cls){   
        Element tem  = null;   
        String name = null;   
        Field[] field = cls.getDeclaredFields();    //所有字段   
        for (int i=0;i<field.length;i++){   
            name = field[i].getName();   
            tem = three.addElement(name);   
            try {   
                Method methodTitle = cls.getMethod(getOnetoUpperCase(name));//查找这个字段的get方法   
                tem.setText(methodTitle.invoke(object)+"");     //执行get方法   
            } catch (Exception e) {   
                e.printStackTrace();   
            }   
        }   
    }   
    /**  
     * 生成get方法  
     * @param str  
     * @return  
     */  
    private String getOnetoUpperCase(String str){   
        return "get"+ firsttoUpperCase(str);   
    }   
       
    /**  
     * 生成set方法  
     * @param str  
     * @return  
     */  
    private String setOnetoUpperCase(String str){   
        return "set"+ firsttoUpperCase(str);   
    }   
    /**  
     * 第一个字母大写  
     * @param str  
     * @return  
     */  
    private String firsttoUpperCase(String str){   
        return Character.toUpperCase(str.charAt(0)) + str.substring(1);   
    }   
  
    public List readXML(Class cls) throws Exception{   
        List list = new ArrayList();   
        String className = cls.getName();//类名包含包名   
        String classes = className.substring(className.lastIndexOf(".")+1,className.length());//类名   
        // 取文件   
        SAXReader sr = new SAXReader();   
        Document doc = sr.read(file);   
        // 取根节点   
        Element root = doc.getRootElement();   
        // 跌带跟节点.   
        Iterator it = root.elementIterator();   
        while (it.hasNext()) {   
            Element two = (Element) it.next();   
            // 当根节点等于datas时   
            if (two.getName().equalsIgnoreCase(classes+"s")) {   
                for (Iterator i = two.elementIterator(); i.hasNext();) {   
                    Element three = (Element) i.next();   
                    Object object = cls.newInstance(); //创建对象   
                    Element element  = null ;    
                    Field[] field ;   
                    for (Iterator y = three.elementIterator(); y.hasNext();){      
                        element = (Element) y.next();                  
                        field = cls.getDeclaredFields();    //所有字段   
                        for (int tem=0;tem<field.length;tem++){   
                            if (field[tem].getName().equals(element.getName())){   
                                field[tem].setAccessible(true);   //设置属性可以修改   
                                setObject(field[tem],object,element);   
                            }   
                        }   
                    }   
                    list.add(object);   
                }   
            }   
        }   
        return list;   
    }   
       
    private void setObject(Field field,Object object,Element element){   
        try {   
            if (field.getType().toString().equals("int"))   
                field.set(object, new Integer(element.getTextTrim()));   
            else if (field.getType().toString().equals("double"))   
                field.set(object, new Double(element.getTextTrim()));   
            else if (field.getType().toString().equals("long"))   
                field.set(object, new Long(element.getTextTrim()));   
            else  
                field.set(object, element.getTextTrim());   
        } catch (Exception e) {   
            e.printStackTrace();   
        }   
    }   
}  


效率:1W两秒,10W溢出
分享到:
评论

相关推荐

    dom4j 和java反射

    dom4j java反射机制 实现bean与xml 的互转 方便很快

    dom4j+反射机制

    dom4j+反射机制dom4j+反射机制dom4j+反射机制dom4j+反射机制

    java解析XML dom4j dom4j-1.6.1.jar

    java解析XML dom4j dom4j-1.6.1.jar dom4j.jarjava解析XML dom4j dom4j-1.6.1.jar dom4j.jar

    dom4j-java-API

    dom4j-&gt;java dom4j开发-&gt;英文~

    dom4j的Java工程

    利用DOM4J写的关于XML文件的增删改查操作,工程内包含DOM4J的jar包。

    java dom4j jar包+dom4j API

    java dom4j jar包+dom4j API

    dom4j解析xml,利用反射机制

    dom4j解析xml,利用反射机制.将解析出来的信息保存到一个类当中

    dom4j-2.1.1-API文档-中英对照版.zip

    标签:dom4j、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。 双语...

    java 通过dom4j操作 xml

    java 通过dom4j操作 xml,含范例和源码

    Java使用sax、dom、dom4j解析xml文档

    Java使用sax、dom、dom4j解析xml文档的代码,包含dom4j的jar包。

    Dom4j 1.6.1 JAVA API

    dom4j帮助文档 官方API All Classes Packages org.dom4j org.dom4j.bean org.dom4j.datatype org.dom4j.dom org.dom4j.dtd org.dom4j.io org.dom4j.jaxb org.dom4j.rule org.dom4j.rule.pattern org.dom...

    java工具类——dom4j

    dom4j是sourceforge.net上的一个开源项目,主要用于对XML的解析。

    java dom4j

    File file = new File&#40;"src" + File.separator + "output.xml"&#41; ; SAXReader reader = new SAXReader() ; Document doc = reader.read(file) ; // 读取XML文件

    Java解析XML文档(DOM与DOM4j两种方式)

    采用DOM与DOM4j两种方式针对XML文档进行增、删、改查的操作,转换方式在Test测试类中实现另一个管理类就可以了!

    java_dom4j架包

    java_dom4j架包

    dom4j dom4j dom4j dom4j

    dom4j dom4j dom4j dom4j dom4j dom4j

    java操作xml dom dom4j sax jdom

    Java 四种方式操作xml,包括xml,dom,sax,jdom这四种方式的一个简单例子。

    Java+flex使用dom4j读写xml

    2.Java方面,使用dom4j对xml进行操作,包括节点的读取,添加,修改,删除。 3.Flex方面,使用DataGrid呈现数据;使用RemoteObject构建和Java的通信;使用到了验证控件Validator;使用了CSS样式对Alert对话框进行了...

    dom4j-jar包下载

    dom4j是一个Java的XML API,类似于jdom,用来读写XML文件...如今你可以看到越来越多的Java软件都在使用dom4j来读写XML,特别值得一提的是连Sun的JAXM也在用dom4j。这是必须使用的jar包, Hibernate用它来读写配置文件。

Global site tag (gtag.js) - Google Analytics