参照网页
http://hi.baidu.com/qmiao128/item/c983bffca5ca6fec1b111f26
http://m.oschina.net/blog/144133
http://blog.csdn.net/feng2007110221053/article/details/7071823
Java中一共有四个类加载器,之所以叫类加载器,是程序要用到某个类的时候,要用类加载器载入内存。
这四个类加载器分别为:Bootstrap ClassLoader、Extension ClassLoader、AppClassLoader
和URLClassLoader,他们的作用其实从名字就可以大概推测出来了。
其中AppClassLoader在很多地方被叫做System ClassLoader
(1).BootStrap ClassLoader:启动类加载器,由C++代码实现,负责加载存放在%JAVA_HOME%\lib目录中的,或者通被-Xbootclasspath参数所指定的路径中的,并且被java虚拟机识别的(仅按照文件名识别,如rt.jar,名字不符合的类库,即使放在指定路径中也不会被加载)类库到虚拟机的内存中,启动类加载器无法被java程序直接引用。
(2).Extension ClassLoader:扩展类加载器,由sun.misc.Launcher$ExtClassLoader实现,负责加载%JAVA_HOME%\lib\ext目录中的,或者被java.ext.dirs系统变量所指定的路径中的所有类库,开发者可以直接使用扩展类加载器。
(3).Application ClassLoader:应用程序类加载器,由sun.misc.Launcher$AppClassLoader实现,负责加载用户类路径classpath上所指定的类库,是类加载器ClassLoader中的getSystemClassLoader()方法的返回值,开发者可以直接使用应用程序类加载器,如果程序中没有自定义过类加载器,该加载器就是程序中默认的类加载器。
(4).URLClassLoader用来加载网络上远程的类,暂且不讨论。
它们之间的关系:
1.Parent-Child,按顺序从大到小。不是简单的继承关系。
2.ClassLoader有个getParent的方法,但是Ext ClassLoader调用后得到的是null,bootstrap是JVM自己的,用户看不到。
3.classloader的委托机制:当等级比较低的ClassLoader要加载某个类的时候,它首先会请求Parent加载器来加载,Parent再请求它的Parent。
比如现在Ext要加载了,它往上请求。如果最大的Bootstrap找不到,那么Boot会叫Ext自己找找,Ext找不到,是不会让下一级的App去找的,此时就报出ClassNotFoundException
但是现实生活中有很多应用,比如JDBC核心方法在核心库,而驱动在扩展库,是必定在两个地方的,那怎么办呢?
要用到Context ClassLoader:我们在建立一个线程Thread的时候,可以为这个线程通过setContextClassLoader方法来指定一个合适的classloader作为这个线程的context classloader,当此线程运行的时候,我们可以通过getContextClassLoader方法来获得此context classloader,就可以用它来载入我们所需要的Class。默认的是system classloader。
利用这个特性,我们可以“打破”classloader委托机制了,父classloader可以获得当前线程的context classloader,而这个context classloader可以是它的子classloader或者其他的classloader,那么父classloader就可以从其获得所需的 Class,这就打破了只能向父classloader请求的限制了。
这个机制可以满足当我们的classpath是在运行时才确定,并由定制的 classloader加载的时候,由system classloader(即在jvm classpath中)加载的。
class可以通过context classloader获得定制的classloader并加载入特定的class(通常是抽象类和接口,定制的classloader中是其实现)。
Tomcat5中类加载器分析
tomcat5中通过自定义一组类加载器,解决了以下几个问题:
(1)部署在一个服务器上的两个Web应用程序自身所使用的Java类库是相互隔离的。
(2)部署在一个服务器上的两个Web应用程序可以共享服务器提供的java共用类库。
(3)服务器尽可能的保证自身安全不受部署的Web应用程序影响。
(4)支持对JSP的HotSwap功能。
tomcat5的目录结构
tomcat5主要根据根据java类库的共享范围,分为4组目录:
(1)common目录:能被Tomcat和所有Web应用程序共享。
(2)server目录:仅能被Tomcat使用,其他Web应用程序不可见。
(3)Shared目录:可以被所有Web应用程序共享,对Tomcat不可见。
(4)WEB-INF目录:只能被当前Web应用程序使用,对其他web应用程序不可见。
tomcat5自定义类加载器
这几个类加载器分别对应加载/common/*、/server/*、/shared/*和 /WEB-INF/*类库, 其中Webapp类加载器和Jsp类加载器会存在多个,每个Web应用对应一个Webapp类加载器。
CommonClassLoader加载的类可以被CatalinaClassLoader和ShareClassLoader使用;
CatalinaClassLoader加载的类和ShareClassLoader加载的类相互隔离;
WebappClassLoader可以使用ShareClassLoader加载的类,但各个WebappClassLoader间相互隔离;JspClassLoader仅能用JSP文件编译的class文件。
Tomcat5启动时classloader加载顺序
Tomcat的class加载的优先顺序一览
1.最先是$JAVA_HOME/jre/lib/ext/下的jar文件。
2.环境变量CLASSPATH中的jar和class文件。
3.$CATALINA_HOME/common/classes下的class文件。
4.$CATALINA_HOME/commons/endorsed下的jar文件。
5.$CATALINA_HOME/commons/i18n下的jar文件。
6.$CATALINA_HOME/common/lib 下的jar文件。
(JDBC驱动之类的jar文件可以放在这里,这样就可以避免在server.xml配置好数据源却出现找不到JDBC Driver的情况。)
7.$CATALINA_HOME/server/classes下的class文件。
8.$CATALINA_HOME/server/lib/下的jar文件。
9.$CATALINA_BASE/shared/classes 下的class文件。
10.$CATALINA_BASE/shared/lib下的jar文件。
11.各自具体的webapp /WEB-INF/classes下的class文件。
12.各自具体的webapp /WEB-INF/lib下的jar文件。
关于WEB-INF/classes和WEB-INF/lib的load优先顺序,weblogic中,可以通过修正WebContent\WEB-INF\weblogic.xml中的如下参数来设定。
<!-- web-inf/classes里面优于lib加载 --> <prefer-web-inf-classes>true</prefer-web-inf-classes>
相关推荐
在Java虚拟机(JVM)中,类加载器(ClassLoader)是至关重要的组成部分,它负责查找和加载类的字节码文件。理解ClassLoader的工作机制对于深入掌握Java应用程序的运行至关重要。这里我们将详细讨论ClassLoader的运行...
《Tomcat类加载机制——ClassLoader详解》 在Java Web开发中,Tomcat作为最常用的Servlet容器,其类加载机制对于理解和优化应用性能至关重要。本文将深入探讨Tomcat的ClassLoader是如何工作的,以及它如何影响到...
Java ClassLoader机制是Java运行时环境中的核心组件之一,它负责加载类到JVM(Java虚拟机)中,使得程序能够执行。理解ClassLoader的工作原理对于优化应用性能、处理类加载问题以及实现自定义加载器至关重要。 首先...
Java ClassLoader机制是Java虚拟机(JVM)中一个至关重要的组成部分,它的主要任务是将类的.class文件加载到JVM中,使得程序能够运行。ClassLoader不仅负责类的加载,还涉及类的验证、初始化等一系列过程。理解...
了解ClassLoader的工作机制对于优化程序性能、处理类冲突以及实现安全的插件系统至关重要。开发者可以根据需求定制ClassLoader,以满足特定的加载需求,如加载动态生成的类或处理版本兼容问题。总的来说,深入理解...
在实际开发中,理解Tomcat的ClassLoader机制有助于我们解决一些常见的问题,如类加载异常、类版本冲突等。例如,当我们需要自定义类加载顺序时,可以通过修改`catalina.properties`文件中的`common.loader`、`server...
### Tomcat中的ClassLoader详解 #### 一、引言 在深入了解Tomcat的工作原理时,一个重要的组成部分就是其ClassLoader机制。本文旨在深入剖析Tomcat中特有的类加载器(ClassLoader)体系结构,帮助读者理解Tomcat...
在Java编程语言中,ClassLoader是核心组件之一,它负责加载类到JVM(Java虚拟机)中执行。本文将深入探讨ClassLoader的工作原理和类加载机制,帮助开发者理解这个至关重要的概念。 1. 类加载机制概述 Java的类加载...
【图解版】深入分析ClassLoader类加载工作机制,从原理到JVM的装载过程,详情分析了ClassLoader加载类以及自定义类加载器的过程,不可用于商业用途,如有版权问题,请联系删除!
《Tomcat学习与分析总结资料》是一份涵盖了Tomcat服务器核心知识的综合资源,适合对Java Web应用服务器感兴趣的开发者深入学习。Tomcat是Apache软件基金会的项目,是世界上最流行的开源Servlet容器,它实现了Java ...
### Java虚拟机中ClassLoader概述与双亲委托机制详解 #### 一、ClassLoader概念与作用 在Java编程语言中,`ClassLoader`是一个非常重要的组件,它负责加载程序运行所需的类文件到Java虚拟机(JVM)中。`ClassLoader`...
System ClassLoader通常被称为应用程序类加载器,它会从`CLASSPATH`环境变量指定的路径加载类库,以及`$CATALINA_HOME/common/classes`、`$CATALINA_HOME/common/lib`下的类和jar包。这里的类库可以被所有web应用...
ClassLoader就是执行这个动态加载任务的机制。 Java ClassLoader的工作流程大致如下: 1. 当程序需要加载一个类时,它会请求ClassLoader。 2. ClassLoader接收到请求后,首先检查该类是否已经加载过,如果已加载则...
在Java世界中,JVM(Java Virtual Machine)是运行所有Java程序的核心,它负责解析字节码并执行程序。ClassLoader是JVM中的一...阅读"ClassLoader简析.pdf"文档和分析"Sample.zip"中的代码,将有助于形成更全面的了解。