前面学习了反射知识和xml文件的dom4j解析方法,下面的一个小案例就是综合了两种知识的运用:
package cn.wwh.www.xml.do4j.exmple; /** *类的作用: * * *@author 一叶扁舟 *@version 1.0 *@创建时间: 2014-7-23 上午10:43:00 */ public class Student { private String name ; private int age; public Student(){} public Student(String name,int age) { super(); this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public void eat(String name,Integer age){ System.out.println(name+"今年"+age+"岁"); System.out.println("他是一个很能吃的小伙子!"); } public void run(String name){ System.out.println(name+"喜欢运动"); } }
文件中包含类的信息(student.xml):
<?xml version="1.0" encoding="UTF-8"?> <root> <student> <className>cn.wwh.www.xml.do4j.exmple.Student</className> <methodName>eat</methodName> <argNameType>java.lang.String</argNameType> <argNameValue>一叶扁舟</argNameValue> <argAgeType>java.lang.Integer</argAgeType> <argAgeValue>22</argAgeValue> </student> </root>
程序主代码(Dom4jParseConfig .java):
package cn.wwh.www.xml.do4j.exmple; import java.lang.reflect.Method; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; import org.junit.Test; /** *类的作用: *从配置文件中解析出来数据,然后利用反射,实现对对象的操作 * * *@author 一叶扁舟 *@version 1.0 *@创建时间: 2014-7-23 上午10:42:33 */ public class Dom4jParseConfig { private String filePath = "src/cn/wwh/www/xml/do4j/exmple/student.xml"; @Test public void testDemo() throws Exception{ // 利用dom4ji解析配置文件 SAXReader reader = new SAXReader(); Document document = reader.read(filePath); String className = document.selectSingleNode("//className").getText(); String methodName = document.selectSingleNode("//methodName").getText(); String argNameType = document.selectSingleNode("//argNameType").getText(); String argNameValue = document.selectSingleNode("//argNameValue").getText(); String argAgeType = document.selectSingleNode("//argAgeType").getText(); String argAgeValue = document.selectSingleNode("//argAgeValue").getText(); // 利用反射,获取对象 Class clazz = Class.forName(className); // 获取方法 Method method = clazz.getMethod(methodName,Class.forName(argNameType),
Class.forName(argAgeType)); method.invoke(clazz.newInstance(),argNameValue,Integer.parseInt(argAgeValue)); } }
输出结果:
一叶扁舟今年22岁 他是一个很能吃的小伙子!
注意:1.在clazz.getMethod(,)中后两个参数应该是class类型,因为argNameType类型为String类型,要将argNameType中的数据“java.lang.String”用Class.forName()转成class类型
2.eat(String,Integer)中的第二个参数应该是int类型,但是int.class为int,测试代码中是无法转换的,所以只能采用Integer类型,则在xml文件中他的类型就为:java.lang.Integer,这样就通过了。
3.document.selectSingleNode("//argAgeValue").getText();的返回值是String类型,所以在invoke()调用时要将这个String类型转换成Int类型的数据。 (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|