根据类名创建类Class.forname
Java实现的工厂模式中,
factory = (EFactory)XMLUtil.getBean();
这句代码中调用XML配置文件中的getBean函数,实现从XML配置文件中读取类的名字,创建该类的对象,最后返回给调用getBean()方法的Java程序中。
这是Java中的反射机制(Java Reflection),在JDK中还提供了java.lang.reflect包,里面封装了一些其他与反射相关的类。
“通过引入DOM和反射机制后,可以再XML Util中实现读取XML文件并根据存储在XML文件中的类名获取对应的对象。”
import javax.xml.parsers.*; import org.w3c.dom; import org.xml.sax.SAXException; import java.io.*; public class XMLUtil { public static Object getBean() { try{ //创建DOM文档对象
DocumentBuilderFactory dFatory = DocumentBuilderFactory.newInstance(); documentBuilder builder = dFactory.newDocumentBuild(); Document doc; doc = builder.parser(new File("config.xml")); //获取包含类名的文件节点
NodeList nl = doc.getElementByTagName("className"); Node classNode = nl.item(0).getFirstChild); String cName = classNode.getNodeValue(); //通过类名生成示例对象并将其返回
Class c = Class.forName(cName); Object object = c.newInstance(); return object; } catch(Exception e) { e.printStackTrace(); return null; } } };
上面代码有Factory Model的影子在里面
DocumentBuilderFactory->documentBuilder->Document
->Node->cName(String)->Class.forName->object
return object;
另外,我在想C++有没有这种动态创建对象的机制
baidu了一下,csdn中的版主(steedhorse)如是说道:
“C++没有运行时的动态类加载机制,做不到的。C++的面向对象仅仅是编译时的。
Java之所以可以那样做,是因为其编译出的类文件中带有元数据信息。”
我想这可能是由于Java建立在虚拟机上面,是半编译半解释的语言,所以能够动态加载的运行,很方便的实现查询类表这种工作。
在c++语言层面上来说并不具备这种功能,但是利用工厂模式,我们同样也可以根据类名来实例化相应的对象。然后类名就可以放在例如记事本这种ASCII文本中,或者利用lua的配置文件存放该类名,调用的时候读取出来。