根据类名创建类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的配置文件存放该类名,调用的时候读取出来。

posted @ 2013-03-06 23:45  KelvinDesus  阅读(1394)  评论(0编辑  收藏  举报