- 浏览: 193420 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
wentry:
java中字符带有斜杠时,比如\\x00\\x00\\x00\ ...
java中调用js脚本 -
chenzheng8975:
...
ajax -
蓝色飞扬:
有用,也碰到这个问题了,多谢!
java.lang.AbstractMethodError: org.apache.xerces.dom.DocumentImpl.setXmlVersion -
刘宇斌:
一篇不错的讲解Java异常的文章(转载)----感觉很不错,读了以后很有启发 -
moxiaomomo:
同样的疑问啊...对tomcat缓存仍然一知半解...
tomcat 缓存
什么是ClassLoader
ClassLoader是一个抽象类,我们用它的实例对象来装载类,它负责将 Java 字节码装载到 JVM 中, 并使其成为 JVM 一部分。 JVM 的类动态装载技术能够在运行时刻动态地加载或者替换系统的某些功能模块,而不影响系统其他功能模块的正常运行。一般是通过类名读入一个class文件来装载这个类,(其它加载形式暂时没有研究过)。
JAVA一般用三个class loader完成类的装载任务(自己定义的class loader出外),它们是Bootstrap Loader、ExtClassLoader和AppClassLoader,最后一个也被SUN称为system class loader。它们的组织方式是:先由Bootstrap Loader生成ExtClassLoader,并设置ExtClassLoader的parent为null(其实准确得说其parent是Bootstrap Loader,但因为Bootstrap Loader由C++写成,并不是逻辑意义上的JAVA类,所以只能为null);然后Bootstrap Loader生成AppclassLoader,设置其parent为ExtClassLoader。
类的装载采用的是代理模式:装载一个类时先由AppClassLoader或自己定义的class loader请求其parent装载,parent再请求它的parent,这样到了顶级,也就是Bootstrap Loader,如果parent looder找到了要装载的类,就由parent loader装载,否则就由它的"下级"去干这件事。这样就一级级委托知道把类找到装载完毕。要说明的是ExtClassLoader和 AppClassLoader都是URLClassLoader的子类,而URLClassLoader可由一个URL对象确定它寻找类的路径,我们可以通过下面的方法发现前述的三种class loader的搜寻路径:
- System.out.println(System.getProperty("sun.boot.class.path"))
- System.out.println(System.getProperty("java.class.path"))
- System.out.println(System.getProperty("java.ext.dirs"))
ClassLoader装载过程
类装载就是寻找一个类或是一个接口的字节码文件并通过解析该字节码来构造代表这个类或是这个接口的 class 对象的过程。在 Java 中,类装载器把一个类装入 Java 虚拟机中,要经过三个步骤来完成:装载、链接和初始化,其中链接又可以分成校验、准备和解析三步,除了解析外,其它步骤是严格按照顺序完成的,各个步骤的主要工作如下:
1. 装载:查找和导入类或接口的字节码;
2. 链接:执行下面的校验、准备和解析步骤,其中解析步骤是可以选择的;
l 校验:检查导入类或接口的二进制数据的正确性;
l 准备:给类的静态变量分配并初始化存储空间;
l 解析:将符号引用转成直接引用;
3. 初始化:激活类的静态变量的初始化 Java 代码和静态 Java 代码块。
装载的实现
JVM 中类的装载是由 ClassLoader 和它的子类来实现的。 Java ClassLoader 是一个重要的 Java 运行时系统组件,它负责在运行时查找和装入 Java 字节码。
在 Java 中, ClassLoader 是一个抽象类,它在包 java.lang 中。可以这样说,只要了解了 ClassLoader 中的一些重要的方法,再结合上面所介绍的 JVM 中类装载的具体的过程,对动态装载类这项技术就有了一个比较大概的掌握,这些重要的方法包括以下几个:
1. loadCass 方法: loadClass(String name ,boolean resolve) 其中 name 参数指定了 JVM 需要的类的名称 , 该名称以类的全限定名表示,如 Java.lang.Object ; resolve 参数告诉方法是否需要解析类,在初始化类之前,应考虑类解析,并不是所有的类都需要解析,如果 JVM 只需要知道该类是否存在或找出该类的超类,那么就不需要解析。这个方法是 ClassLoader 的入口点。
2. defineClass 方法 这个方法接受类文件的字节数组并把它转换成 Class 对象。字节数组可以是从本地文件系统或网络装入的数据。它把字节码分析成运行时数据结构、校验有效性等等。
3. findSystemClass 方法 findSystemClass 方法从本地文件系统装入 Java 字节码。它在本地文件系统中寻找类文件,如果存在,就使用 defineClass 将字节数组转换成 Class 对象。当运行 Java 应用程序时 , 这是 JVM 正常装入类的缺省机制。
4. resolveClass 方法 resolveClass(Class c) 方法解析装入的类,如果该类已经被解析过那么将不做处理。当调用 loadClass 方法时 , 通过它的 resolve 参数决定是否要进行解析。
5. findLoadedClass 方法 当调用 loadClass 方法装入类时 , 调用 findLoadedClass 方法来查看 ClassLoader 是否已装入这个类 , 如果已装入 , 那么返回 Class 对象 , 否则返回 NULL 。如果强行装载已存在的类 , 将会抛出链接错误。
java.lang.Class类
某 个类的所有实例内部都有一个引用,指向该类对应的Class的实例的位置,每个java类对应的Class实例可以当作是类在内存中的代理人。所以当要获 得类的信息(如有哪些类变量,有哪些方法)时,都可以让类对应的Class的实例代劳.java的Reflection机制就大量的使用这种方法来实现。 但是Class类无法手工实例化,当载入任意类的时候自动创建一个该类对应的Class的实例。每个java类都是由某个classLoader (ClassLoader的实例)来载入的,因此Class类别的实例中都会他的ClassLoader的实例的引用。可以通过 getClass.getClassLoader()得到CLassLoader的实例。
java动态载入class的两种方式:
1)implicit隐式,即利用实例化才载入的特性来动态载入class
2)explicit显式方式,又分两种方式:
a)java.lang.Class的forName()方法
b)java.lang.ClassLoader的loadClass()方法
各种java类由哪些classLoader加载?
1)java类可以通过实例.getClass.getClassLoader()得到
2)接口由AppClassLoader(SystemClassLoader)载入 ,SystemClassLoader:可以由ClassLoader.getSystemClassLoader()获得实例
3)ClassLoader类由bootstrap loader载入
ClassLoader hierachy:
1)jvm初始化产生bootstrap loader。并设定它的父ClassLoader为null
2)bootstrap loader建立AppClassLoader,载入 运行java.exe时 的-cp或-classpath中的类(每个运行中的线程都有一个成员contextClassLoader,用来在运行时动态地载入其它类系统默认的 contextClassLoader是systemClassLoader)
Java 类装载的代理结构
根 (Bootstrap) 装载器:该装载器没有父装载器,它是 JVM 实现的一部分,从 sun.boot.class.path 装载运行时库的核心代码。
扩展 (Extension) 装载器:继承的父装载器为根装载器,不像根装载器可能与运行时的操作系统有关,这个类装载器是用纯 Java 代码实现的,它从 java.ext.dirs ( 扩展目录 ) 中装载代码。
系统 (System or Application) 装载器:装载器为扩展装载器,我们都知道在安装 JDK 的时候要设置环境变量 (CLASSPATH ) ,这个类装载器就是从 java.class.path(CLASSPATH 环境变量 ) 中装载代码的,它也是用纯 Java 代码实现的,同时还是用户自定义类装载器的缺省父装载器。
小应用程序 (Applet) 装载器:父装载器为系统装载器,它从用户指定的网络上的特定目录装载小应用程序代码。
java中的代理结构是自上而下查找类的,这与很多web装载器不同。
tomcat中的实现的子ClassLoader的结构
Tomcat Server在启动的时候将构造一个ClassLoader树,以保证模块的类库是私有的
Tomcat Server的ClassLoader结构如下:
---------------------------+
| Bootstrap |
| | |
| System |
| | |
| Common |
| / \ |
| Catalina Shared |
| / \ |
| WebApp1 WebApp2 |
---------------------------+
其中:
- Bootstrap - 载入JVM自带的类和$JAVA_HOME/jre/lib/ext/*.jar
- System - 载入$CLASSPATH/*.class
- Common - 载入$CATALINA_HOME/common/...,它们对TOMCAT和所有的WEB APP都可见
- Catalina - 载入$CATALINA_HOME/server/...,它们仅对TOMCAT可见,对所有的WEB APP都不可见
- Shared - 载入$CATALINA_HOME/shared/...,它们仅对所有WEB APP可见,对TOMCAT不可见(也不必见)
- WebApp? - 载入ContextBase?/WEB-INF/...,它们仅对该WEB APP可见
ClassLoader被组织成树形,一般的工作原理是:
1) 线程需要用到某个类,于是contextClassLoader被请求来载入该类
2) contextClassLoader请求它的父ClassLoader来完成该载入请求
3) 如果父ClassLoader无法载入类,则contextClassLoader试图自己来载入
注意:WebApp?ClassLoader的工作原理和上述有少许不同:
它先试图自己载入类(在ContextBase?/WEB-INF/...中载入类),如果无法载入,再请求父ClassLoader完成
发表评论
-
java 修饰符
2009-10-31 16:37 1340Java语言定义了public、protected、priva ... -
Java虚拟机 堆
2009-10-25 22:27 1070Java程序在运行时创建的所有类实例或者数组都放在堆 ... -
Java虚拟机 方法区
2009-10-25 21:09 1820对于被装载的每个类,虚拟机都会把这个类的类型信息存储在方法区, ... -
Java虚拟机 体系结构
2009-10-25 21:03 1210当一个Java虚拟机运行一 ... -
java中调用js脚本
2009-10-16 18:27 14852JDK1.6加入了对Script(JSR ... -
Java 位运算
2009-09-28 16:43 4979Java 位运算[转] 一,Java 位运算 ... -
拾遗补缺-jdk6新特性
2009-08-09 17:13 12021,输出到文件 java Hello.java > he ... -
拾遗补缺-ResourceBundle
2009-08-08 23:54 2442http://gceclub.sun.com.cn/Java_ ... -
拾遗补缺-logger
2009-08-08 23:33 1153java.util.logging.Logger的使用 20 ... -
拾遗补缺-date
2009-08-08 23:22 932DateFormat 来格式化日期 2009年01月21日 ... -
Callable与Future
2009-08-08 22:40 1501java.util.concurrent.Callable与j ... -
concurren套件(转载)
2009-08-08 22:31 1269从J2SE 5.0开始有了java.util.concurre ... -
java多线程转载
2009-08-07 18:06 1124Java Thread API 允许程序员编写具有多处理机制优 ... -
java字符集
2009-08-04 17:05 1880ASCII 字符集 1.名称的由来 ASCII( ... -
ajax
2007-09-22 18:12 1474今天第一 ... -
Ajax链接servlet的一个注意事项
2007-09-23 18:02 860这是我用到的一段代码: createXMLHttpReq ... -
tomcat 缓存
2007-09-24 19:28 1449今天写项目的时候遇到一个问题: 就是当打印自定义异常的时候一 ... -
如何用javascript控制checkbox,并进行批量删除
2007-09-24 19:51 1707在做系统数据删除的时候,往往需要批量删除一些数据,如何做到呢? ... -
用servlet filter 解决编码问题的一个小例子
2007-09-24 20:02 1195当在做程序的是你也许会遇到一些很让你恼火的乱码问 ... -
转发和重定向的区别的一点理解
2007-09-24 21:54 971他们的调用分别如下例: request.getRequest ...
相关推荐
Java 虚拟机中ClassLoader 相关简介 双亲委托机制 Android 中ClassLoader 简介
ClassLoader运行机制 自己写的ClassLoader运行机制 自己写的ClassLoader运行机制 自己写的ClassLoader运行机制 自己写的ClassLoader运行机制 自己写的
破解java加密的ClassLoader.java,在classloader植入破解代码
自定义classloader的使用
Java ClassLoader定制实例
java classloader classpath 张孝祥
理解Java ClassLoader机制
用于验证理解Android中Classloader加载类机制的程序demo,从中可以对比DexClassLoader和PathClassLoader的区别联系。
ClassLoader类加载机制和原理详解
内容简介: ClassLoader体系结构 类装载器在JVM中并不是唯一的,JVM自带了三个装载器,用户也可以根据自己的需求自定义新的装载器,这些装载器的体系结构可以看作是树状结构,如图1所示:
关于J2EE服务器的ClassLoader的原理,该文档清晰了揭示了jvm装载类的顺序,同时用户可以自定义修改classLoader的配置 通过该文档,可以加深对Java虚拟机的理解
重温java之classloader体系结构(含hotswap) 启动类加载器 扩展类加载器 系统类加载器
【图解版】深入分析ClassLoader类加载工作机制,从原理到JVM的装载过程,详情分析了ClassLoader加载类以及自定义类加载器的过程,不可用于商业用途,如有版权问题,请联系删除!
深入了解Java_ClassLoader,Bytecde.pdf
一个开源的Cplusplus类加载器,基于它实现了一个简单的例子,见我写的classloader的文章。
classloader 加密解密应用程序 ,反编译class
JVM内存模型,类加载模式工作机制详细,内存屏障,类从被加载到虚拟机内存中开始,直到卸载出内存为止,它的整个生命周期包括了:加载、验证、准备、解析、初始化、使用和卸载这7个阶段。其中,验证、准备和解析这三...
Classloader
ClassLoader类加载器讲解,理解JAVA类加载机制