论坛首页 Java企业应用论坛

Java 动态加载类问题

浏览 3507 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-08-27  
项目 DD 如下描述:
有一个接口类   A.
有个动态载入指定类  B.
动态载入类 B 是通过传递一个参数classPath='com.xxx.test.aImpl' 来进行动态加载指定类.

DD 发布运行正常.
当将 DD 打包成jar放在 EE 项目下用的时候,出现:java.lang.ClassNotFoundException

EE 项目中有 A 接口实现类.调用 B 的动态加载.出现找不到接口 A .

不打包执行正常,打包后就出现错误.
/**
 * 自定义的类加载器
 */
public class DynaLoadClass extends ClassLoader {
	private static String PATH = null;
	
	@SuppressWarnings("unchecked")
	protected Class findClass(String name) throws ClassNotFoundException {
		try {
			String classPath = getClassPath(name);
			FileInputStream fin = new FileInputStream(classPath);
			File cf = new File(classPath);
			byte[] raw = new byte[(int) cf.length()];
			fin.read(raw);
			fin.close();
			return defineClass(name, raw, 0, raw.length);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return super.findClass(name);
	}
	/**
	 * 得到Class的绝对路径
	 * @param name
	 * @return
	 */
	private String getClassPath(String name) {
		if(PATH == null){
			PATH = DynaLoadClass.class.getClassLoader().getResource("").toString()
			.replace("file:/", "").replace("%20", " ");
		}
		return PATH + name.replace('.', File.separatorChar) + ".class";
	}
}
   发表时间:2012-08-27   最后修改:2012-08-27
你直接Class.forName(com.xx.A),也报错吗?

如果这样能加载A类,那么说明你的发的这段代码有问题。你就直接用Class.forName替换你这段代码
0 请登录后投票
   发表时间:2012-08-27  
当前的CLASS LOADER肯定不对.
建议用ThreadLocal.getClassLoader去加载类
0 请登录后投票
   发表时间:2012-08-28  
关注一下,楼主解决了以后分享一下分析结果
0 请登录后投票
   发表时间:2012-08-28  
抱歉,没注意到帖子了.
问题解决了.
http://yangkai0332.iteye.com/blog/1664048
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics