设计目的:使用dom4j读出xml格式的配置文件,然后根据配置文件的信息,反射出一个已经编写好的类。
配置文件如下:
XML语言: Properties.xml
01 <?xml version="1.0" encoding=”UTF-8″?>
02 <classes>
03 <class>
04 <name>com.openwudi.excise.ReflectDom4j.A</name>
05 <method>
06 <name>show</name>
07 <parameter>
08 <para-type>java.lang.String</para-type>
09 <para-value>hello,world!</para-value>
10 </parameter>
11 </method>
12 </class>
13 </classes>
将要被反射的类:
Java语言: A.java
1 package com.openwudi.excise.ReflectDom4j;
2
3 public class A {
4 public void show(String s){
5 System.out.println(s);
6 }
7 }
主程序:使用了传统的dom4j和xpath两种不同的方式读取xml配置文件。
Java语言: ReflectFromXML.java
01 package com.openwudi.excise.ReflectDom4j;
02
03 import java.io.File;
04 import java.lang.reflect.Method;
05
06 import org.dom4j.Document;
07 import org.dom4j.Element;
08 import org.dom4j.io.SAXReader;
09
10 public class ReflectFromXML {
11 static String clazzName;
12 static String methodName;
13 static String methodPara;
14 static String methodParaValue;
15 /**
16 * @author WuDi
17 */
18 public static void main(String[] args) throws Exception {
19 SAXReader reader = new SAXReader();
20 Document doc = reader.read(new File("src/Properties.xml"));
21 //读取配置信息
22 //getClazz(doc);
23 getClazzByXpath(doc);
24 //反射出A类
25 reflectA();
26 }
27
28 //反射出A类
29 private static void reflectA() throws Exception {
30 Class clazzA = Class.forName(clazzName);
31 Method showMethod = clazzA.getMethod(methodName, Class.forName(methodPara));
32 showMethod.invoke(clazzA.newInstance(),methodParaValue);
33 }
34
35 //得到XML配置信息
36 private static void getClazz(Document doc) {
37 Element rootE = doc.getRootElement();
38 Element clazzE = rootE.element("class");
39 Element clazzNameE = clazzE.element("name");
40 clazzName = clazzNameE.getText();
41 Element methodE = clazzE.element("method");
42 Element methodNameE = methodE.element("name");
43 methodName = methodNameE.getText();
44 Element methodparameterE = methodE.element("parameter");
45 Element methodParaTypeE = methodparameterE.element("para-type");
46 Element methodParavValueE = methodparameterE.element("para-value");
47 methodPara = methodParaTypeE.getText();
48 methodParaValue = methodParavValueE.getText();
49 }
50
51 //用xpath得到XML配置信息
52 private static void getClazzByXpath(Document doc) {
53 Element clazzNameE = (Element) doc.selectSingleNode("/classes/class/name");
54 clazzName = clazzNameE.getText();
55 Element methodNameE = (Element) doc.selectSingleNode("/classes/class/method/name");
56 methodName = methodNameE.getText();
57 Element methodParaTypeE =(Element) doc.selectSingleNode("/classes/class/method/parameter/para-type");
58 Element methodParavValueE = (Element) doc.selectSingleNode("/classes/class/method/parameter/para-value");
59 methodPara = methodParaTypeE.getText();
60 methodParaValue = methodParavValueE.getText();
61 }
62
63 }