Class.forName(name).newInstance()与简单工厂模式结合 的问题?

04-12-07 gaocya
ejb里调用dao工厂时抛出异常,ClassLoders not Found,具体相关代码如下,请问Class.forName使用是否有限制?


建立dao工厂,通过传递的类名daoName 动态生成具体的dao,但在实际运行抛出异常,
package com.sma.factory;

import com.sma.dao.stu.StuDao;
import com.sma.dao.DaoInterface;
public class DaoFactory {
public DaoFactory() {
}
public DaoInterface createDao(String daoName)

{
DaoInterface di=null;
try
{
di=(DaoInterface)Class.forName(daoName).newInstance();
}
catch(Exception e)
{
e.printStackTrace();
}
return di;

}

}

ejb里调用工厂createDao方法生成需要的dao完成具体操作

DaoFactory df=new DaoFactory();
DaoInterface df=df.test();//运行时产生异常ClassLoders not Found

gaocya
2004-12-07 16:59
查看了一些资料据说可能与jboss classloaders有关,希望得到大家的指点

gaocya
2004-12-09 10:04
help

wangjinpeng
2004-12-10 11:43
Class.forName(daoName).newInstance()中daoName必须为实现接口类的详细路径,比如com.sma.dao.daoname,建议用xml文件做一个dao类的向导,每次取得传递值后去xml中取得类路径。

gaocya
2004-12-13 13:52
谢谢楼上,问题关键时运行抛出异常

banq
2004-12-13 20:17
这个帖子给你答案

http://www.jdon.com/jive/thread.jsp?forum=91&thread=15456

使用Thread.currentThread().getContextClassLoader()

gaocya
2004-12-15 14:05
多谢banq,你提示的我试过了,但问题一样.
有朋友说可能是打包时造成的问题,我在jbuilder里开发,用jbuilder打包工具进行,不知大家有没有这方面的建议.

我如果在用Class.forname 之前 StuDao stu=new StuDao()进行一次实例化,然后用Class.forname就没问题了,但这样也就失去动态加载的优势了,请大家帮忙分析一下

banq
2004-12-18 12:03
是的,你必须将dao这些类打包到EJB的JAR中。

gaocya
2004-12-22 10:41
我已经打包进去了

kindongzhang
2006-07-22 15:48
我记得有一次,我用Eclipse3.1.2的时候,当用debug模式启动Tomcat服务器(5.5.16)的时候,不知道为什么总是提示ClassLoader找不到,当时没有留意,而后把整个Eclipse重新弄了一下才好了,现在也不出现这个错误了.连最初的其他错误提示都没有看到.

paris_li
2006-07-27 16:14
ghhg

paris_li
2006-07-27 16:14
bbb

paris_li
2006-07-27 16:15
这里怎么发帖啊?