反射应用一(获取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>
运行结果:


浙公网安备 33010602011771号