java类加载器-tomcat中的类加载器

      过去一直不理解,为什么java为什么搞那么多类加载器,还为什么允许自定义类加载器,总是感觉很多余。今天重读《深入体验Java_Web开发内幕-核心基础》时,明白了,两字“安全”!!!。先看看“类加载器的示意图”,据说是tomcat4.x,但这不影响我们。

 

java类加载器-tomcat中的类加载器_第1张图片

 

 

 

现在这中情况下:

1.应用webaap1被加载到webaapLoader1中,应用webaap2被加载到webaapLoader2中,由于webaap1中的类和webaap2中的类没有加载到一个类加载器中,所以他们之间无法互相反问。不用担心webaap1个调用webaap2中的对象,从而……。(要是我直接在webaap1中写代码覆盖原来webaap2中的class对象呢,呵呵)

2.ShareLoader中加载的类是可以让所有webapp使用的,这到可以减少多余的lib。

 

另外,关于tomcat类加载器的结构,我们同时可以通过代码去理解,servlet代码如下:

 

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class HelloServlet extends HttpServlet {
	public void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.setContentType("text/html;charset=GB2312"); 
		PrintWriter out = response.getWriter();
		 
		out.println("<html>");
		out.println("<font size=30 color=red>测试喽</font><br>");
		out.println("<marquee>" + new java.util.Date() + "</marquee>");
		ClassLoader currLoader=this.getClass().getClassLoader();
		out.println("加载当前类"+this.getClass().getName()+"的类加载器:<b>"+currLoader.getClass().getName()+"</b>");
		out.println("<br/>");
		
		while(null!=currLoader.getParent()){
			ClassLoader parentLoader=currLoader.getParent();
			out.println(" 类加载器:"+currLoader.getClass().getName()+"的父加载器为:<b>"+parentLoader.getClass().getName()+"</b>");
			out.println("<br/>");
			currLoader=parentLoader;
		}
		
		out.println("</html>");
	}
}
 

 

tomcat-6.0.29下的运行生成效果:

 

java类加载器-tomcat中的类加载器_第2张图片

 

      由此次可见,“类加载器的示意图”基本是正确的。但貌似少了CommonLoader,在“类加载器的示意图”这可是个分支节点啊。

 

 

 

tomcat-5.5.26下的运行生成效果:

 

java类加载器-tomcat中的类加载器_第3张图片

  奇怪,关于“org.apache.catalina.loader.StandardClassLoader”出现两次的情况,很迷茫

****

你可能感兴趣的:(tomcat)