读配置文件操作对象
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类型的数据。
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类型的数据。
相关文章推荐
- Tabs Outliner(标签系统)
- 使用Service服务后台运行Toast显示小火箭
- 【C++探索之旅】第一部分第十一课:小游戏,猜单词
- 围棋人机大战:为什么AlphaGo不首先挑战中国棋手?(无责任猜测,不幸猜中不胜荣幸)
- C++泛型算法
- leetcode 232. Implement Queue using Stacks
- hiho 1269(二分)
- 2016.3.14__CSS 浮动__第五天
- spring boot第一个例子
- iOS开发 – 应用国际化开发 - Localizable.strings
- 【js】js 总结,提供公共utils js
- 比较分析 Spring AOP 和 AspectJ 之间的差别
- read h323plus
- 什么是项目生命周期?如何划分项目阶段?有什么意义?
- 【C++探索之旅】第一部分第十一课:小游戏,猜单词
- 架构设计:系统间通信(20)——MQ:消息协议(下)
- $ git reset --hard HEAD~1 出现的异常
- 记一次高级调试错误(附高级调试方法)
- nginx 反代+负载均衡
- cocos2d-x iOS真机下载非根目录文件提示下载失败解决办法