反射应用一(获取xml中键所对应的值)

反射应用的四个步骤:

①获取类的字节码

②通过字节码去创建对象

③反射得到了要调用的方法对象method

④通过反射调用方法

 

熟悉反射的方法:

student类

package com.lemon.java.maven.day03;

public class Student {
    private String name;
    private String age;
    private String gender;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public Student() {

    }

    public Student(String name, String age, String gender) {
        this.name = name;
        this.age = age;
        this.gender = gender;
    }

    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return "name=" + this.name + ",age=" + this.age + ",gender=" + this.gender;
    }
}

测试反射方法:

public static void main(String[] args) throws Exception{
        //1.获取类的字节码---第一种拿到字节码文件
        Class<Student> clazz=Student.class;
 
        //2.通过字节码调用newInstance方法创建对象,底层调用默认构造函数
        Student student=clazz.newInstance();
        
        //3.反射得到要调用的方法对象method

        //getMethods()会获取Student中的所有public 方法,还会到处基础父类的一些Public方法
        Method[] methods=clazz.getMethods();
        for(Method method:methods){
            //getName是获取方法的方法名
            System.out.println(method.getName());
        }
        
        //4.通过反射调用方法,"setName"是方法名,String.class是对应方法名的数据类型
        Method setNameMethod=clazz.getMethod("setName", String.class);
        //5.通过反射完成方法调用
        setNameMethod.invoke(student, "张三");
        
        //通过getName取出来数据
        Method getNameMethod=clazz.getMethod("getName");
        //student传入的是类名
        Object value=getNameMethod.invoke(student);
        System.out.println("name="+value.toString());
        
    }

 

 

通过反射解析xml文件,需要用到Student类进行解析:

public class ReflectDemo {
    public static void main(String[] args) throws Exception {
        String  path="src/test/resources/student.xml";
        List<Student> students=parseXml(path);
        System.out.println(students);
    }

    private static List<Student> parseXml(String path) throws Exception {
        // 创建解析器SaxReader对象
        SAXReader reader = new SAXReader();
        // 获取document对象
        Document document = reader.read(new File(path));
        // 获取根元素
        Element element = document.getRootElement();
        // 获取根元素下的子元素,传入子元素名称,可以传入多个
        List<Element> list = element.elements("student");

        // 集合保存对象
        List<Student> students = new ArrayList<Student>();
        
        //A.获取类的字节码
        Class<Student> clazz=Student.class;
        
        // 遍历子元素
        for (Element studentElement : list) {
            //获取学生对象所有信息,三个学生---【姓名,年龄,性别】
            List<Element> elements=studentElement.elements();
            //B.通过字节码去创建对象,因为存在着3个Student对象
            Student student=clazz.newInstance();
            //循环三个学生对象
            for(Element element2:elements){
                //获取元素的标签名Name,Age,Gender
                String elementName=element2.getName();
                //拼接一个set使上面获得属性名成为setName,setAge,setGender
                String methodName="set"+elementName;
                //C.反射得到要调用的方法对象method
                Method method=clazz.getMethod(methodName,String.class);
                //D.通过反射调用方法
                method.invoke(student,element2.getText());
            }
            // 往集合添加对象
            students.add(student);
        }
        return  students;
    }
}

 

需要解析的文件:

<?xml version="1.0" encoding="UTF-8"?>
<students>
    <student number="1801001">
        <Name>王尼玛</Name>
        <Age>21</Age>
        <Gender></Gender>
    </student>
    <student number="1801002">
        <Name>赵铁柱</Name>
        <Age>22</Age>
        <Gender></Gender>
    </student>
    <student number="1801003">
        <Name>李小花</Name>
        <Age>18</Age>
        <Gender></Gender>
    </student>

</students>

 运行结果:

 

posted @ 2020-05-30 22:54  白菜哎  阅读(112)  评论(0)    收藏  举报