`
liushilang
  • 浏览: 85655 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

如何用URLClassLoader来加载一个指定目录下的class类

阅读更多

直接插入我的代码:

public class ServletProcessor1 {

	public void process(Request request, Response response) {
		// TODO Auto-generated method stub
		String uri = request.getUri();
		System.out.println(uri);
		String servletName = uri.substring(uri.lastIndexOf("/")+1);
		URLClassLoader loader = null;
		try{
			URL[] urls = new URL[1];
			URLStreamHandler streamHandler = null;
			File classPath = new File(Constants.WEB_ROOT);
			
			String repository = (new URL("file",null,classPath.getCanonicalPath()+File.separator)).toString();
			urls[0] = new URL(null,repository,streamHandler);
			loader = new URLClassLoader(urls);
		}catch(IOException e){
			e.printStackTrace();
		}
		Class myClass = null;
		try{
			myClass = loader.loadClass(servletName);
		}catch(ClassNotFoundException e){
			System.out.println(e.toString());
		}
		Servlet servlet = null;
		try{
			servlet = (Servlet)myClass.newInstance();
			servlet.service((ServletRequest)request, (ServletResponse)response);
		}catch(Exception e){
			System.out.println(e.toString());			
		}
	}
}

 运行时,总发现 myClass = loader.loadClass(servletName); 报错,

"servletName" 是有WebRoot/WEb-INF/CLASS文件下是有的,

不过在com/servlet_/test/包下面.

 

请高手赐教,急呀!

分享到:
评论
1 楼 woshixushigang 2011-08-15  
loader.loadClass(servletName);  
这个servletName 应该是包名形式的。
Java是利用ClassLoader来加载类到内存的,ClassLoader本身是用java语言写的,所以我们可以扩展自己的 ClassLoader。利用URLClassLoader可以加载指定jar包中的类到内存。在命行上利用URLClassLoader加载jar时,是使用系统类加载器来加载class的,所以在web环境下,就会出错。这是因为JVM中一个类用其全名和一个加载类ClassLoader的实例作为唯一标识的。我们只要利用URLClassLoader的传入当前线程类加载器即可解决。
形如:URLClassLoader myClassLoader  =   new  URLClassLoader( new  URL[]   { url } , Thread.currentThread().getContextClassLoader());

相关推荐

Global site tag (gtag.js) - Google Analytics