在XML文件配置写入类名,提取配置文件创建对象的例子
为了可扩展性和类和类之间解耦,对抽象层的具体实现类的实例化,不直接使用new关键字来创建对象,而是将类名写入配置文件,再由Java反射机制,读取XML文件,根据文件里的类的名字生成对象。如将一个具体工厂类类名存储在下面的XML文档中:
<?xml version="1.0" encoding="UTF-8"?>
<config>
<className>com.whpu.abstractFactory.CashPayFactory</className>
</config>
//类的名称应该为全限定名:包名+类名
Java反射机制(Java Reflection)是指在程序运行时获取已知名称的类或已有对象的相关信息的一种机制,通过名字创建对象的例子如下:
//反射,用类名生产实例对象
Class c = Class.forName(cName);
Object obj = c.newInstance();
通过引入DOM和反射机制后,可以在XMLUtil中实现读取xml文件并根据存储在xml文件中的类名获取对应的对象,详细代码如下:
import org.w3c.dom.*;
import javax.xml.parsers.*;
import java.io.File;
//工具类
public class XMLUtil {
//生成配置文件中一个名字的实例对象
public static Object getBean(){
try {
//创建DOM对象
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//文件解析器--由它读配置文件
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc;
//用磁盘绝对路径表示配置文件
doc = builder.parse(new File("D:\\qilinIDEA\\DesignPatterns\\_04AbstractFactory\\resource/config.xml"));
//获取包含类名的文本节点
NodeList nl = doc.getElementsByTagName("className");
Node classNode = nl.item(0).getFirstChild();
String cName = classNode.getNodeValue();
//反射,用类名生产实例对象
Class c = Class.forName(cName);
Object obj = c.newInstance();
return obj;
}catch (Exception e){
e.printStackTrace();
return null;
}
}
}
使用工具类,直接调用XMLUtil工具类静态方法getBean()进行类的实例化,代码如下:
类型 对象 = (类型)XMLUtil.getBean();//getBean()返回类型是Object,要强制转换成指定类型