反射获取数据后用XML文件进行保存读取操作

本文介绍如何结合Java的反射机制和XML文件,实现数据的保存和读取操作。通过反射获取对象属性,并利用XML进行序列化和反序列化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

反射+XML文件保存读取操作

代码展示:

package 包名;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

/**
 * @description:
 * @author: Anonymous
 * @time: 2020/3/6 16:46
 */
public class MainProject {
    public static void main(String[] args)
            throws IllegalAccessException, DocumentException, NoSuchMethodException, InvocationTargetException, IOException {
        ArrayList<Student> list = new ArrayList<>();

        readDataFromXML(list);

        for (Student student : list) {
            System.out.println(student);
        }
    }

    public static void saveDateToXML(ArrayList<Student> list) throws IllegalAccessException, IOException {
        // 创建XML文件对应Document对象
        Document document = DocumentHelper.createDocument();

        // 明确根节点
        Element root = document.addElement("students");

        // 获取所有的成员变量Field对象
        Field[] declaredFields = Student.class.getDeclaredFields();

        // 循环遍历Student ArrayList集合
        for (Student student : list) {
            // 每一个Student对象都要对应一个Student节点
            Element element = root.addElement("student");

            // 遍历所有的Field成员变量
            for (Field declaredField : declaredFields) {
                declaredField.setAccessible(true);

                // id存储到Student节点中的属性中
                if ("id".equals(declaredField.getName())) {
                    // 所有的数据都是在String类型处理
                    element.addAttribute("id", declaredField.get(student) + "");
                } else {
                    // declaredField.getName() 成员变量名字 declaredField.get(student) 对应数据
                    element.addElement(declaredField.getName()).addText(declaredField.get(student) + "");
                }
            }
        }

        // 字符流对象+Document对象的write方法写入XML信息到文件中
        FileWriter fileWriter = new FileWriter("./xml/student.xml");
        document.write(fileWriter);
        fileWriter.close();
    }

    public static void readDataFromXML(ArrayList<Student> list)
            throws DocumentException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        Document document = new SAXReader().read(new File("./xml/student.xml"));

        // 找出当前XML文件中的所有student节点
        List list1 = document.selectNodes("//student");

        // 得到当前Student类内的所有成员变量对象,注意使用暴力反射
        Field[] declaredFields = Student.class.getDeclaredFields();

        /*
        String字符串问题
            name String getText
            gender String getText

            id Integer Attribute ==> Integer
            age Integer getText ==> Integer
         */

        // 遍历所有的Student节点
        for (Object o : list1) {
            // Student节点对象
            Element element = (Element) o;
            Student student = new Student();

            // 成员变量Field数组遍历
            for (Field declaredField : declaredFields) {
                // 给予暴力反射操作成员变量权限
                declaredField.setAccessible(true);

                // 获取当前成员变量的数据类型
                Class<?> type = declaredField.getType();

                // 如果数据类型是String类型
                if (type.equals(String.class)) {
                    // String
                    declaredField.set(student, element.element(declaredField.getName()).getText());
                } else if (type.equals(Integer.class)) {
                    // Integer类型
                    // 获取Integer类型中的valueOf方法
                    Method valueOf = type.getMethod("valueOf", String.class);

                    if ("id".equals(declaredField.getName())) {
                        /*
                        id是在student节点属性中,从属性中获取对应是数据,使用valueOf方法转换成对应的Integer类型
                         */
                        declaredField.set(student, valueOf.invoke(student, element.attributeValue("id")));
                    } else {
                        /*
                        非ID数据,从Student指定名字的子节点下获取,指定名字和成员变量名字一直,同样需要转换一下
                         */
                        declaredField.set(student,valueOf.invoke(student, element.element(declaredField.getName()).getText()));
                    }
                }
            }

            list.add(student);
        }

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值