Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 292|回复: 0

[Java反射学习]通过注释和反射读写xml文件

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-10-30 23:57:58 | 显示全部楼层 |阅读模式
    1. java 通过注解和反射读写 xml
    2. // XmlUtils.java
    3. import java.io.FileInputStream;
    4. import java.io.FileNotFoundException;
    5. import java.io.FileOutputStream;
    6. import java.io.IOException;
    7. import java.lang.reflect.Constructor;
    8. import java.lang.reflect.Field;
    9. import java.lang.reflect.Method;
    10. import java.util.ArrayList;
    11. import java.util.Iterator;
    12. import java.util.List;
    13. import org.dom4j.Document;
    14. import org.dom4j.DocumentHelper;
    15. import org.dom4j.Element;
    16. import org.dom4j.io.OutputFormat;
    17. import org.dom4j.io.SAXReader;
    18. import org.dom4j.io.XMLWriter;
    19. /**
    20. * 读写 xml 文件
    21. *
    22. * @date 2009-12-8 下午07:22:07
    23. */
    24. public class XmlUtils {
    25.     /**
    26.      * 创建一个 xml 文件
    27.      *
    28.      * @param file_path
    29.      */
    30.     public void write(String file_path) {
    31.         // 文件输出流
    32.         FileOutputStream out = null;
    33.         try {
    34.             out = new FileOutputStream(file_path);
    35.             // 新建 format 用来格式化 xml 文件
    36.             OutputFormat format = OutputFormat.createPrettyPrint();
    37.             format.setEncoding("utf-8");                         // 编码格式
    38.             format.setIndentSize(4);                             // Tab 缩进
    39.             XMLWriter writer = new XMLWriter(out, format);
    40.             Document document = DocumentHelper.createDocument(); // 创建文档
    41.             Element root = document.addElement("beans");         // 创建根节点
    42.             // //////////////// one /////////////////////
    43.             Element node = root.addElement("student");
    44.             Element id = node.addElement("id");
    45.             Element name = node.addElement("name");
    46.             Element age = node.addElement("age");
    47.             id.addText("001");
    48.             name.addText("孙悟空");
    49.             age.addText("500");
    50.             // //////////////// two /////////////////////
    51.             node = root.addElement("student");
    52.             id = node.addElement("id");
    53.             name = node.addElement("name");
    54.             age = node.addElement("age");
    55.             id.addText("002");
    56.             name.addText("猪八戒");
    57.             age.addText("300");
    58.             // //////////////// three /////////////////////
    59.             node = root.addElement("student");
    60.             id = node.addElement("id");
    61.             name = node.addElement("name");
    62.             age = node.addElement("age");
    63.             id.addText("003");
    64.             name.addText("沙和尚");
    65.             age.addText("200");
    66.             // 写到文件中
    67.             writer.write(document);
    68.             writer.flush();
    69.             writer.close();
    70.         } catch (FileNotFoundException e) {
    71.             e.printStackTrace();
    72.         } catch (IOException ioe) {
    73.         }
    74.     }
    75.     /**
    76.      * 读取一个 xml 文件
    77.      *
    78.      * @param file_path
    79.      */
    80.     public void read(String file_path) {
    81.         FileInputStream in = null;
    82.         SAXReader reader = null;
    83.         try {
    84.             in = new FileInputStream(file_path);
    85.             reader = new SAXReader();
    86.             Document document = reader.read(in);                // 获得文档
    87.             Element root = document.getRootElement();           // 获得根节点
    88.             List< Element> list = root.selectNodes("student");   // 获得所有 student 子节点
    89.             // 输出头信息
    90.             Object[] header = { "id", "name", "age" };
    91.             System.out.println("+---------+----------+---------+");
    92.             System.out.format("|%8s | %8s |%8s |
    93. ", header);
    94.             System.out.println("+---------+----------+---------+");
    95.             for (int i = 0; i < list.size(); i++) {
    96.                 Element el = list.get(i);
    97.                 Iterator< Element> fields = el.elementIterator();
    98.                 Object[] args = new Object[4];
    99.                 int index = 0;
    100.                 while (fields.hasNext()) {
    101.                     Element field = fields.next();
    102.                     args[index++] = field.getText();
    103.                 }
    104.                 System.out.format("|%8s | %7s |%8s |
    105. ", args);
    106.             }
    107.         } catch (FileNotFoundException e) {
    108.             e.printStackTrace();
    109.         } catch (org.dom4j.DocumentException docE) {
    110.         } finally {
    111.             if (in != null) {
    112.                 try {
    113.                     in.close();
    114.                 } catch (IOException e) {
    115.                     e.printStackTrace();
    116.                 }
    117.             }
    118.         }
    119.     }
    120.     /**
    121.      * 从 xml 文件中读取一个 List
    122.      *
    123.      * @param file_path
    124.      * @param cls
    125.      * @return
    126.      */
    127.     public static List getList(String file_path, Class cls, String xpath) {
    128.         FileInputStream in = null;
    129.         SAXReader reader = null;
    130.         Object obj = null;
    131.         List beanList = new ArrayList();
    132.         try {
    133.             in = new FileInputStream(file_path);
    134.             reader = new SAXReader();
    135.             Document document = reader.read(in);            // 获得文档
    136.             Element root = document.getRootElement();       // 获得根节点
    137.             List< Element> list = root.selectNodes(xpath);   // 根据 xpath 获取子节点
    138.             // 实例化一个构造器
    139.             Constructor cons = cls.getDeclaredConstructor(); // 默认构造函数
    140.             // 遍历子节点
    141.             for (int i = 0; i < list.size(); i++) {
    142.                 Element el = list.get(i);
    143.                 // 新建一个对象
    144.                 obj = cons.newInstance();
    145.                 // 返回所有声明的域 ,包括 private 的域
    146.                 Field[] fds = cls.getDeclaredFields();
    147.                 // 构造 set 方法
    148.                 String fname = "";                          // 域名称
    149.                 String setMethod = "";                      // set 方法名称
    150.                 for (int j = 0; j < fds.length; j++) {
    151.                     fname = fds[j].getName();               // 取出字段名称
    152.                     setMethod = "set"                       // 构造 set 方法
    153.                             + Character.toUpperCase(fname.charAt(0))
    154.                             + fname.substring(1);
    155.                     // 创建 Method
    156.                     Method m = cls.getMethod(setMethod, String.class);
    157.                     // 取出注解
    158.                     XmlField f = fds[j].getAnnotation(XmlField.class);
    159.                     if (f == null) {                        // 当前属性没有使用该注解
    160.                         continue;
    161.                     }
    162.                     String label = f.label();
    163.                     if (label.equals("")) {                 // 注解值为空
    164.                         continue;
    165.                     }
    166.                     String val = el.elementText(label);     // 根据注解取出 xml 中对应的 text
    167.                     // 调用 setMethod 方法
    168.                     m.invoke(obj, val);                     // 将对象加入到 List 中
    169.                 }
    170.                 beanList.add(obj);
    171.             }
    172.         } catch (Exception e) {
    173.             e.printStackTrace();
    174.         } finally {
    175.             if (in != null) {
    176.                 try {
    177.                     in.close();
    178.                 } catch (IOException e) {
    179.                     e.printStackTrace();
    180.                 }
    181.             }
    182.         }
    183.         return beanList;
    184.     }
    185.     /**
    186.      * 将 List 保存到 xml 中
    187.      *
    188.      * @param file_path
    189.      * @param list
    190.      */
    191.     public static void saveList(String file_path, List list, String elementName) {
    192.         if (list == null || list.size() < 1) {              // 没有数据需要保存
    193.             return;
    194.         }
    195.         // 文件输出流
    196.         FileOutputStream out = null;
    197.         try {
    198.             out = new FileOutputStream(file_path);
    199.             // 新建 format 用来格式化 xml 文件
    200.             OutputFormat format = OutputFormat.createPrettyPrint();
    201.             format.setEncoding("utf-8");                         // 编码格式
    202.             format.setIndentSize(4);                             // Tab 缩进
    203.             XMLWriter writer = new XMLWriter(out, format);
    204.             Document document = DocumentHelper.createDocument(); // 创建文档
    205.             Element root = document.addElement("beans");         // 创建根节点
    206.             for (int i = 0; i < list.size(); i++) {
    207.                 Element node = root.addElement(elementName);
    208.                 Object obj = list.get(i);
    209.                 Class cls = obj.getClass();
    210.                 // 返回所有声明的域,包括 private 的域
    211.                 Field[] fds = cls.getDeclaredFields();
    212.                 String fname = "";                               // 域名称
    213.                 String getMethod = "";                           // get 方法名称
    214.                 for (int j = 0; j < fds.length; j++) {
    215.                     fname = fds[j].getName();
    216.                     getMethod = "get"
    217.                             + Character.toUpperCase(fname.charAt(0))
    218.                             + fname.substring(1);
    219.                     // 创建Method
    220.                     Method m = cls.getMethod(getMethod);
    221.                     // 调用 getMethod 方法
    222.                     String val = (String) m.invoke(obj);
    223.                     // 取出注解
    224.                     XmlField f = fds[j].getAnnotation(XmlField.class);
    225.                     if (f == null) {                             // 当前属性没有使用该注解
    226.                         continue;
    227.                     }
    228.                     String label = f.label();
    229.                     if (label.equals("")) {                      // 注解值为空
    230.                         continue;
    231.                     }
    232.                     Element el = node.addElement(label);
    233.                     el.addText(val);
    234.                 }
    235.             }
    236.             // 写到文件中
    237.             writer.write(document);
    238.             writer.flush();
    239.             writer.close();
    240.         } catch (Exception e) {
    241.             e.printStackTrace();
    242.         }
    243.     }
    244.     /**
    245.      * main
    246.      *
    247.      * @param args
    248.      */
    249.     public static void main(String[] args) {
    250.         String path = "d:/text.xml";
    251. //         XmlUtils xml = new XmlUtils();
    252. //         xml.write(path);
    253. //         xml.read(path);
    254. //         List list = getList(path, Student.class,"//student");
    255. //         for(int i=0;i< list.size();i++){
    256. //             System.out.println(list.get(i));
    257. //         }
    258.         List< Student> list = new ArrayList< Student>();
    259.         Student bean = new Student();
    260.         bean.setId("101");
    261.         bean.setName("张三");
    262.         bean.setAge("500");
    263.         list.add(bean);
    264.         bean = new Student();
    265.         bean.setId("102");
    266.         bean.setName("李四");
    267.         bean.setAge("600");
    268.         list.add(bean);
    269.         bean = new Student();
    270.         bean.setId("103");
    271.         bean.setName("王五");
    272.         bean.setAge("600");
    273.         list.add(bean);
    274.         saveList(path, list, "student");
    275.         System.out.println("...ok...");
    276.     }
    277. }
    278. // XmlField.java
    279. import java.lang.annotation.Documented;
    280. import java.lang.annotation.ElementType;
    281. import java.lang.annotation.Inherited;
    282. import java.lang.annotation.Retention;
    283. import java.lang.annotation.RetentionPolicy;
    284. import java.lang.annotation.Target;
    285. /**
    286. * 注解
    287. * @date 2009-12-9 上午10:35:43
    288. */
    289. @Target(ElementType.FIELD)            // 域声明 : 表示注解用在什么地方
    290. @Retention(RetentionPolicy.RUNTIME)   // 在 JVM 运行期也保留注解 : 表示注解的级别
    291. @Documented                           // 将此注解包含在 javadoc 中
    292. @Inherited                            // 允许子类继承父类中的注解
    293. public @interface XmlField {
    294.     String label();
    295.     String description() default "";
    296. }
    297. // Student.java
    298. public class Student {
    299.     @XmlField(label="id")
    300.     private String id;
    301.    
    302.     @XmlField(label="name")
    303.     private String name;
    304.    
    305.     @XmlField(label="age")
    306.     private String age;
    307.     private String desc;
    308.    
    309.     public String getId() {
    310.         return id;
    311.     }
    312.     public void setId(String id) {
    313.         this.id = id;
    314.     }
    315.     public String getName() {
    316.         return name;
    317.     }
    318.     public void setName(String name) {
    319.         this.name = name;
    320.     }
    321.     public String getAge() {
    322.         return age;
    323.     }
    324.     public void setAge(String age) {
    325.         this.age = age;
    326.     }
    327.    
    328.     public String getDesc() {
    329.         return desc;
    330.     }
    331.     public void setDesc(String desc) {
    332.         this.desc = desc;
    333.     }
    334.     /**
    335.      * toString
    336.      */
    337.     public String toString(){
    338.         StringBuffer sb = new StringBuffer();
    339.         sb.append("Student :{");
    340.         sb.append("
    341. id:"+id);
    342.         sb.append("
    343. name:"+name);
    344.         sb.append("
    345. age:"+age);
    346.         sb.append("
    347. desc:"+desc);
    348.         sb.append("
    349. }");
    350.         return sb.toString();
    351.     }
    352. }

    复制代码


       
         
         
          
          

            
          

            
          
         
       

      


    源码下载:http://file.javaxxz.com/2014/10/30/235757921.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-6 00:54 , Processed in 0.347398 second(s), 34 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表