过去一直不理解,为什么java为什么搞那么多类加载器,还为什么允许自定义类加载器,总是感觉很多余。今天重读《深入体验Java_Web开发内幕-核心基础》时,明白了,两字“安全”!!!。先看看“类加载器的示意图”,据说是tomcat4.x,但这不影响我们。
现在这中情况下:
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下的运行生成效果:
由此次可见,“类加载器的示意图”基本是正确的。但貌似少了CommonLoader,在“类加载器的示意图”这可是个分支节点啊。
tomcat-5.5.26下的运行生成效果:
奇怪,关于“org.apache.catalina.loader.StandardClassLoader”出现两次的情况,很迷茫。
****