JAVA ClassLoader 介绍

java程序不是本地的可执行程序,它的执行依赖jvm,jvm运行后将 class 文件加载到jvm,然后才能在jvm内部运行。负责加载这些class的组件就是ClassLoader。

JVM本身包含了一个ClassLoader称为**BootstrapClassLoader**,和JVM自身一样,**BootstrapClassLoader**是用本地代码(c/c++等)实现的,它负责加载核心Java  class(如rt.jar里的class)。另外JVM还提供了两个ClassLoader,它们都是用Java语言编写的,由BootstrapClassLoader加载到jvm,它们是**ExtClassLoader**和**AppClassLoader**,其中**ExtClassLoader**负责加载Java扩展 class(如jre/lib/ext下的类),**AppClassLoader**负责加载应用程序自身的类(如-classpath下的class)。

我们可以通过JVM参数 -Xbootclasspath 指定自定义的BootstrapClassLoader,但通常是不需要的。

当运行一个程序的时候,JVM启动,运行Bootstrap ClassLoader,该ClassLoader加载java核心API(ExtClassLoader和AppClassLoader也在此时被加载),然后调用ExtClassLoader加载扩展API,最后调用AppClassLoader加载应用CLASSPATH下定义的Class,这就是一个程序最基本的加载流程。

JVM自带的ClassLoader只是懂得从本地文件系统加载标准的java class文件,但是我们可能会有下面的应用场景:
1)在执行类加载之前,自动验证数字签名
2)动态地创建符合用户特定需要的定制化构建类
3)从特定的场所取得 class,例如数据库、网络等
4) 自定义加解密Class 等等
这时候我们就需要定制自己的ClassLoader,java提供了很方便的api供我们定制自己的ClassLoader。

事实上当使用Applet的时候,就用到了特定的ClassLoader,因为需要从网络上加载java class,并且要检查相关的安全信息。另外,应用服务器大都使用了自定义ClassLoader技术,了解类加载原理也有助于我们更好地开发自己的应用。

##ClassLoader结构
java中内置了很多类加载器,本文只讨论几个核心类加载器:
**ClassLoader**:所有类加载器的基类,它是抽象的,定义了类加载最核心的操作。
**SecureClassLoader**:继承自ClassLoader,添加了关联类源码、关联系统policy权限等支持。
**URLClassLoader**:继承自SecureClassLoader,支持从jar文件和文件夹中获取class
**ExtClassLoader**:扩展类加载器,继承自URLClassLoader,负责加载java的扩展类(javax.*等),查看源码可知其查找范围为System.getProperty("java.ext.dirs"),通常是jre/lib/ext
**AppClassLoader**:应用类加载器,继承自URLClassLoader,也叫系统类加载器(ClassLoader.getSystemClassLoader()可得到它),它负载加载应用的classpath下的类,查找范围System.getProperty("java.class.path"),通过-cp或-classpath指定的类都会被其加载

java没有提供Launcher的源码,可参考openjdk的Launcher类源码。

上面介绍的是ClassLoader的静态类结构,在概念上,它们还有树形结构,java中的每个ClassLoader都有自己的父加载器(**注意区分,不是类关系上的 super**),可以通过ClassLoader.getParent() 获取到,当jvm启动完成后,默认情况下,他们的树形结构是这样的:
自定义的ClassLoader其父加载器为AppClassLoader,
AppClassLoader的父加载器为ExtClassLoader,
ExtClassLoader的父加载器为null,
null表示其父加载器为 BootstrapClassLoader(非java实现故显示为null)。

参考:http://blog.csdn.net/conquer0715/article/details/38229203

时间: 2024-10-12 16:30:37

JAVA ClassLoader 介绍的相关文章

理解Java ClassLoader机制(转载)

当JVM(Java虚拟机)启动时,会形成由三个类加载器组成的初始类加载器层次结构: bootstrap classloader                |       extension classloader                |       system classloader bootstrap classloader -引导(也称为原始)类加载器,它负责加载Java的核心类. 在Sun的JVM中,在执行java的命令中使用-Xbootclasspath选项或使用 - D

(转)Java ClassLoader详解

转:http://java.chinaitlab.com/base/804400.html 类加载器是 Java 语言的一个创新,也是 Java 语言流行的重要原因之一.它使得 Java 类可以被动态加载到 Java 虚拟机中并执行.类加载器从 JDK 1.0 就出现了,最初是为了满足 Java Applet 的需要而开发出来的.Java Applet 需要从远程下载 Java 类文件到浏览器中并执行.现在类加载器在 Web 容器和 OSGi 中得到了广泛的使用.一般来说,Java 应用的开发人

java classLoader机制解析

类从被加载到虚拟机内存中开始,到卸装出内存为止,它的整个生命周期包括了:加载,连接(验证,准备,解析),初始化,使用和卸载七个阶段.其中验证.准备和解析三个部分称为连接,也就是说,一个Java类从字节代码到能够在JVM中被使用,需要经过加载.链接和初始化这三个步骤 .我们看一看Java虚拟机的体系结构. Java虚拟机的体系结构如下图所示: Java类加载的全过程,是加载.验证.准备.解析和初始化这五个阶段的过程.而加载阶段是类加载过程的一个阶段.在加载阶段,虚拟机需要完成以下三件事情: 通过一

Java ClassLoader加载机制理解 实际例子

针对 Java ClassLoader加载机制理解, 做了个如何自定制简单的ClassLoader,并成功加载指定的类. 不废话,直接上代码. package com.chq.study.cl; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOExcept

java classLoader体系结构使用详解

原创整理不易,转载请注明出处:java classLoader体系结构使用详解 代码下载地址:http://www.zuidaima.com/share/1774052029516800.htm jvm classLoader architecture: Bootstrap ClassLoader/启动类加载器 主要负责jdk_home/lib目录下的核心 api 或 -Xbootclasspath 选项指定的jar包装入工作. Extension ClassLoader/扩展类加载器  主要负

Java监控工具介绍,VisualVm ,JProfiler,Perfino,Yourkit,Perf4J,JProbe,Java微基准测试

本文是本人前一段时间做一个简单Java监控工具调研总结,主要包括VisualVm ,JProfiler,Perfino,Yourkit,Perf4J,JProbe,以及对Java微基准测试的简单介绍,总结下来比较推荐,Visualvm,Perfino,yourkit和Jprofiler(推荐值按顺序依次递减),其它工具不太推荐使用.下面是文章目录结构:  一.VisualVm  1.简介 2 2.安装插件并启动VisualVM 2 3.内存分析 3 4.CPU分析 5 5.线程分析 6 6.连接

Java注解介绍

原文链接: Java Annotations: An Introduction原文日期: 2005年10月14日翻译日期: 2014年07月20日翻译人员: 铁锚 翻译完后,感觉这篇文章是不是在http://www.developer.com被挖坟了? Java注解介绍 基于注解(Annotation-based)的Java开发无疑是最新的开发趋势.[译者注: 这是05年的文章,在2014年,毫无疑问,多人合作的开发,使用注解变成很好的合作方式,相互之间的影响和耦合可以很低]. 基于注解的开发将

[转载] 深入了解Java ClassLoader、Bytecode 、ASM、cglib

转载自http://www.iteye.com/topic/98178 一.Java ClassLoader 1,什么是ClassLoader 与 C 或 C++ 编写的程序不同,Java 程序并不是一个可执行文件,而是由许多独立的类文件组成,每一个文件对应于一个 Java 类. 此外,这些类文件并非立即全部都装入内存,而是根据程序需要装入内存.ClassLoader 是 JVM 中将类装入内存的那部分. 而且,Java ClassLoader 就是用 Java 语言编写的.这意味着创建您自己的

Java关键字介绍之this与super

1.什么是super?什么是this? super关键字表示超(父)类的意思.this变量代表对象本身. 2.使用super&this调用成员变量和方法 可以使用super访问父类被子类隐藏的变量或覆盖的方法.当前类如果是从超类继承而来的,当调用super.XX()就是调用基类版本的XX()方法.见示例1. 当类中有两个同名变量,一个属于类(类的成员变量),而另一个属于某个特定的方法(方法中的局部变量),使用this区分成员变量和局部变量.见示例2. 示例1 class Person { pro