您的位置:首页 > 其它

读配置文件操作对象

2016-03-14 16:22 302 查看
前面学习了反射知识和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类型的数据。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: