首页 > Web开发 > 详细

使用URLClassLoader类载入类实例

时间:2015-11-15 20:33:17      阅读:375      评论:0      收藏:0      [点我收藏+]

 

Tomcat当中在接受到要调用的Servlet请求后,需要载入相应的Servlet类,然后创建Servlet类实例,从而调用Servlet类实例的service()方法

下面实例的场景,request和response分别是一个javax.servlet.ServletRequest实例和一个javax.servlet.ServletResponse实例,request通过getUri()方法从ServletRequest当中获取uri

uri格式为/servlet/servletName

其中servletName就是所请求servlet资源的类名,针对这个资源名,调用URLClassLoader类载入相应的类实例

 

public void process(Request request, Response response)
	{

		String uri = request.getUri();
		String servletName = uri.substring(uri.lastIndexOf("/") + 1);
		URLClassLoader loader = null;

		try
		{
			// create a URLClassLoader
			URL[] urls = new URL[1];
			URLStreamHandler streamHandler = null;
			File classPath = new File(Constants.WEB_ROOT);
			// the forming of repository is taken from the createClassLoader
			// method in
			// org.apache.catalina.startup.ClassLoaderFactory
			String repository = (new URL("file", null, classPath.getCanonicalPath() + File.separator)).toString();
			// the code for forming the URL is taken from the addRepository
			// method in
			// org.apache.catalina.loader.StandardClassLoader class.
			urls[0] = new URL(null, repository, streamHandler);
			loader = new URLClassLoader(urls);
		} catch (IOException e)
		{
			System.out.println(e.toString());
		}
		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());
		} catch (Throwable e)
		{
			System.out.println(e.toString());
		}

	}

使用java.net.URLClassLoader类来完成,该类是java.lang.ClassLoader类的一个直接子类,一旦创建了URLClassLoader类的实例之后,就可以使用它的loadClass()方法来载入Servlet类,实例化URLClassLoader类有三种方法,也就是有三个构造方法

 

构造方法摘要
URLClassLoader(URL[] urls)
使用默认的委托父 ClassLoader 为指定的 URL 构造一个新 URLClassLoader。
URLClassLoader(URL[] urls, ClassLoader parent)
为给定的 URL 构造新 URLClassLoader。
URLClassLoader(URL[] urls, ClassLoader parent, URLStreamHandlerFactory factory)
为指定的 URL、父类加载器和 URLStreamHandlerFactory 创建新 URLClassLoader。
URLClassLoader


参数:
urls - 从其位置加载类和资源的 URL 
抛出: 
SecurityException - 如果安全管理器存在并且其 checkCreateClassLoader 方法不允许创建类加载器。
另请参见:
SecurityManager.checkCreateClassLoader()

  

public URLClassLoader(URL[] urls)使用默认的委托父 ClassLoader 为指定的 URL 构造一个新 URLClassLoader。\n
首先在父类加载器中搜索 URL,然后按照为类和资源指定的顺序搜索 URL。这里假定任何以 ‘/‘ 结束的 URL 都是指向目录的。\n
如果不是以该字符结束,则认为该 URL 指向一个将根据需要下载和打开的 JAR 文件。 如果有安全管理器,该方法首先调用安全管理器的 checkCreateClassLoader 方法以确保允许创建类加载器。

 

使用URLClassLoader类载入类实例

原文:http://www.cnblogs.com/wuxinliulei/p/4967101.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!