- 浏览: 198548 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
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 1430Java语言定义了public、protected、priva ... -
Java虚拟机 堆
2009-10-25 22:27 1117Java程序在运行时创建的所有类实例或者数组都放在堆 ... -
Java虚拟机 方法区
2009-10-25 21:09 1860对于被装载的每个类,虚拟机都会把这个类的类型信息存储在方法区, ... -
Java虚拟机 体系结构
2009-10-25 21:03 1249当一个Java虚拟机运行一 ... -
java中调用js脚本
2009-10-16 18:27 14969JDK1.6加入了对Script(JSR ... -
Java 位运算
2009-09-28 16:43 5078Java 位运算[转] 一,Java 位运算 ... -
拾遗补缺-jdk6新特性
2009-08-09 17:13 12961,输出到文件 java Hello.java > he ... -
拾遗补缺-ResourceBundle
2009-08-08 23:54 2530http://gceclub.sun.com.cn/Java_ ... -
拾遗补缺-logger
2009-08-08 23:33 1193java.util.logging.Logger的使用 20 ... -
拾遗补缺-date
2009-08-08 23:22 1023DateFormat 来格式化日期 2009年01月21日 ... -
Callable与Future
2009-08-08 22:40 1535java.util.concurrent.Callable与j ... -
concurren套件(转载)
2009-08-08 22:31 1309从J2SE 5.0开始有了java.util.concurre ... -
java多线程转载
2009-08-07 18:06 1166Java Thread API 允许程序员编写具有多处理机制优 ... -
java字符集
2009-08-04 17:05 1973ASCII 字符集 1.名称的由来 ASCII( ... -
ajax
2007-09-22 18:12 1588今天第一 ... -
Ajax链接servlet的一个注意事项
2007-09-23 18:02 908这是我用到的一段代码: createXMLHttpReq ... -
tomcat 缓存
2007-09-24 19:28 1546今天写项目的时候遇到一个问题: 就是当打印自定义异常的时候一 ... -
如何用javascript控制checkbox,并进行批量删除
2007-09-24 19:51 1743在做系统数据删除的时候,往往需要批量删除一些数据,如何做到呢? ... -
用servlet filter 解决编码问题的一个小例子
2007-09-24 20:02 1235当在做程序的是你也许会遇到一些很让你恼火的乱码问 ... -
转发和重定向的区别的一点理解
2007-09-24 21:54 1013他们的调用分别如下例: request.getRequest ...
相关推荐
### Java虚拟机中ClassLoader概述与双亲委托机制详解 #### 一、ClassLoader概念与作用 在Java编程语言中,`ClassLoader`是一个非常重要的组件,它负责加载程序运行所需的类文件到Java虚拟机(JVM)中。`ClassLoader`...
在Java虚拟机(JVM)中,类加载器(ClassLoader)是至关重要的组成部分,它负责查找和加载类的字节码文件。理解ClassLoader的工作机制对于深入掌握Java应用程序的运行至关重要。这里我们将详细讨论ClassLoader的运行...
《深入理解ClassLoader工作机制》 Java虚拟机(JVM)中的ClassLoader是负责加载类到内存中的核心组件。它不仅承担着将字节码转换为可执行对象的重任,还参与了类生命周期的各个阶段,包括加载、验证、准备、解析、...
在Java中,Classloader是加载类的关键组件,它负责查找、加载和初始化字节码文件。自定义Classloader允许开发者根据特定需求定制类的加载逻辑,例如加密类文件、隔离不同版本的库或者动态加载代码。本文将深入探讨...
在Java编程语言中,ClassLoader是一个至关重要的组成部分,它负责加载类到JVM(Java虚拟机)中,使得程序能够执行。本示例"ClassLoader小例子"将深入探讨这个概念,并通过一个具体的程序来演示其工作原理。下面我们...
Java ClassLoader机制是Java虚拟机(JVM)中一个至关重要的组成部分,它的主要任务是将类的.class文件加载到JVM中,使得程序能够运行。ClassLoader不仅负责类的加载,还涉及类的验证、初始化等一系列过程。理解...
在Java编程语言中,`ClassLoader`是一个至关重要的组件,它负责加载类到JVM(Java虚拟机)中。本文将深入探讨`ClassLoader`的工作原理、加密解密应用程序以及如何防止类被反编译。 首先,让我们理解`ClassLoader`的...
在Java编程语言中,ClassLoader是一个至关重要的组成部分,它负责加载类到JVM(Java虚拟机)中。理解ClassLoader的工作原理以及如何定制它,对于深入学习Java的运行机制和进行高级应用开发具有重要意义。本篇文章将...
在Java世界中,类加载器(ClassLoader)是关键的组件之一,它负责将类的字节码文件(.class)从文件系统或网络中加载到Java虚拟机(JVM)中,使得程序能够运行。本篇文章将深入探讨ClassLoader的关系网络以及如何...
《ClassLoader详解》 Java应用程序的运行离不开类的加载,而ClassLoader正是这个过程的关键角色。它负责将类的字节码加载到Java虚拟机(JVM)中并转换为可执行的Java对象。深入理解ClassLoader的工作原理对于优化...
Java ClassLoader机制是Java运行时环境中的核心组件之一,它负责加载类到JVM(Java虚拟机)中,使得程序能够执行。理解ClassLoader的工作原理对于优化应用性能、处理类加载问题以及实现自定义加载器至关重要。 首先...
在Java编程语言中,ClassLoader是核心组件之一,它负责加载类到JVM(Java虚拟机)中执行。本文将深入探讨ClassLoader的工作原理和类加载机制,帮助开发者理解这个至关重要的概念。 1. 类加载机制概述 Java的类加载...
在Java编程语言中,ClassLoader是一个至关重要的组成部分,它负责加载类到JVM(Java虚拟机)中执行。这篇测试主要探讨了ClassLoader的工作原理及其在实际应用中的使用。通过阅读给出的博文链接,我们可以深入理解...
### Java ClassLoader与ClassPath详解 #### 一、概述 在Java编程中,类加载机制是十分关键的一个环节。类加载器(`ClassLoader`)负责将编译后的`.class`文件加载到Java虚拟机(JVM)中执行,而类路径(`ClassPath...
Java的类加载器(ClassLoader)体系结构是JVM(Java虚拟机)中至关重要的一部分,它负责将类的字节码转换为运行时的类实例。本文将深入探讨启动类加载器、扩展类加载器、系统类加载器以及用户自定义类加载器,同时还...
破解java加密的ClassLoader.java,在classloader植入破解代码