`
wangdf_jee
  • 浏览: 114219 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

类装载器ClassLoader

    博客分类:
  • Java
阅读更多
类装载器工作机制
类装载器就是寻找类的节码文件并构造出类在JVM 内部表示对象的组件。在Java 中,
类装载器把一个类装入JVM 中,要经过以下步骤:
1.装载:查找和导入Class 文件;
通过一个类的全限定名来获取定义此类的二进制字节流.然后将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构.最后在Java堆中生成一个代表这个类的java.lang.class对像,作为方法区的数据入口.

2.链接:执行校验、准备和解析步骤,其中解析步骤是可以选择的:
a)校验:检查载入Class 文件数据的正确性;
b)准备:给类的静态变量分配存储空间;
c)解析:将符号引用转成直接引用;

3.初始化:对类的静态变量、静态代码块执行初始化工作。

类装载工作由ClassLoader 及其子类负责,ClassLoader 是一个重要的Java 运行时系统组件,它负责在运行时查找和装入Class 字节码文件。JVM 在运行时会产生三个
ClassLoader:
BootstrapClassLoader
Extension ClassLoader(扩展类装载器)
Application ClassLoader(系统类装载器)。

其中,BootstrapClassLoader不是ClassLoader 的子类,它使用C++编写,因此我们在Java 中看不到它,BootstrapClassLoader负责装载JRE 的核心类库,如JRE 目标下的rt.jar、charsets.jar 等。

Extension ClassLoader 和Application ClassLoader 都是ClassLoader 的子类。其中Extension ClassLoader 负责装载 JRE 扩展目录ext 中的JAR 类包;Application 负责装载Classpath 路径下的类包。

public class ClassLoaderTest {
public static void main(String[] args) {
ClassLoader loader = Thread.currentThread().getContextClassLoader();
System.out.println("current loader:"+loader);
System.out.println("parent loader:"+loader.getParent());
System.out.println("grandparent loader:"+loader.getParent(). getParent());
}
}


current loader:sun.misc.Launcher$AppClassLoader@131f71a
parent loader:sun.misc.Launcher$ExtClassLoader@15601ea
//①根装载器在Java中访问不到,所以返回null
grandparent loader:null

   
     通过以上的输出信息,我们知道当前的ClassLoader 是AppClassLoader,父ClassLoader是ExtClassLoader,祖父ClassLoader 是根类装载器,因为在Java 中无法获得它的句柄,所以仅返回null。


JVM 装载类时使用“全盘负责委托机制”,“全盘负责”是指当一个ClassLoader 装载一个类的时,除非显式地使用另一个ClassLoader,该类所依赖及引用的类也由这个ClassLoader 载入;“委托机制”是指先委托父装载器寻找目标类,只有在找不到的情况下才从自己的类路径中查找并装载目标类。这一点是从安全角度考虑的,试想如果有人编写了一个恶意的基础(如java.lang.String)并装载到JVM 中将会引起多么可怕的后果。但是由于有了“全盘负责委托机制”,java.lang.String 永远是由根装载器来装载的,这样就避免了上述事件的发生。
分享到:
评论

相关推荐

    类装载器ClassLoader1

    类装载器ClassLoader1

    Java的类装载器和命名空间

    这个模型可以用层次结构来表示,例如,系统类装载器(AppClassLoader)的父类是扩展类装载器(ExtClassLoader),扩展类装载器的父类是启动类装载器(Bootstrap ClassLoader)。在示例代码`LoaderSample1`中,我们...

    Java深度历险(2)--深入类装载器

    3. **App ClassLoader**(应用程序类装载器):这是默认的类装载器,负责加载应用程序类路径(ClassPath)所指定的类。 此外,还可以自定义类装载器以满足特定需求,比如热部署(Hot Deployment)、模块化加载等。 ...

    jvm类装载器原理

    在Java中,ClassLoader是一个抽象类,位于`java.lang`包中,它是所有类装载器的基类。理解ClassLoader的关键在于掌握几个核心方法: 1. `loadClass(String name, boolean resolve)`:这是类装载的入口点。`name`...

    深入JVM内核—原理、诊断与优化视频教程-6. 类装载器

    在Java虚拟机(JVM)中,类装载器(ClassLoader)是至关重要的组成部分,它负责查找和加载Java类到JVM内存中。本教程聚焦于深入理解JVM内核,特别是类装载器的原理、诊断与优化。在这个第六部分中,我们将探讨以下几...

    java之jvm学习笔记五(实践写自己的类装载器)

    Java的类装载器分为三个基本层次:启动类装载器(Bootstrap ClassLoader)、扩展类装载器(Extension ClassLoader)和应用程序类装载器(Application ClassLoader)。它们共同协作,根据类的全限定名(包括包名和...

    [浅析J2EE应用服务器的JAVA类装载器]python回朔异常的模块.docx

    下面是扩展装载器(Extension ClassLoader),它从扩展目录加载代码,然后是系统装载器(System ClassLoader),从classpath加载用户类。 类装载器遵循以下规则: 1. 一致性规则:每个类加载器维护一个名字空间,...

    Java虚拟机类装载的原理及实现

    除此之外,还有扩展类装载器(Extension ClassLoader)和应用类装载器(Application ClassLoader),分别用于加载扩展目录下的类库和应用程序本身的类。 #### 动态装载的应用场景 动态类装载在多种情况下非常有用...

    Java虚拟机类装载:原理、实现与应用.doc

    在实际开发中,类装载器的层次结构是关键,包括引导类装载器(Bootstrap ClassLoader)、扩展类装载器(Extension ClassLoader)和应用程序类装载器(Application ClassLoader),它们共同构成了双亲委派模型,保证...

    利用类装载器动态加载类并启动类

    1. **定义类装载器**:继承`java.lang.ClassLoader`类,并重写`findClass`方法。 2. **加载解密后的类**: - 使用`FileInputStream`读取解密后的`.class`文件。 - 将读取到的字节流转换为字节数组。 - 调用`...

    JAVA虚拟机的类装载机制的原理分析与应用研究.pdf

    这一过程涉及到了四个主要角色:类装载器(ClassLoader)、类的二进制表示、验证(Verification)、准备(Preparation)以及初始化(Initialization)。下面我们将逐一解析这些环节。 1. **类装载器**: 类装载器...

    Java虚拟机类装载:原理、实现与应用

    装载阶段涉及寻找并导入类或接口的二进制数据,通常由类装载器(ClassLoader)执行。链接阶段则包括校验、准备和解析,校验确保二进制数据的正确性,准备阶段为类的静态变量分配内存并初始化,解析则将符号引用转化...

    Java面试 spring知识点 线程池 面试题

    接下来是类装载器ClassLoader,它负责加载类到JVM中。Spring通过自定义ClassLoader实现对Bean的动态加载和替换,面试中可能会考察你对不同类型的ClassLoader的理解以及它们在Spring中的作用。 Spring AOP原理涉及到...

    Java软件开发实战 Java基础与案例开发详解 2-5 java虚拟机简介 共8页.pdf

    3. **类装载器ClassLoader**:将编译后的.class文件加载到JVM中。 4. **字节码校验**:JVM中的字节码校验器检查加载的字节码是否符合规范,以确保程序的安全性。 5. **解释执行**:JVM的解释器负责将字节码转换为...

    Java虚拟机类装载.doc

    在Java中,类装载器 把一个类装入Java虚拟机中,要经过三个步骤来完成:装载、链接和初始化。其中链接又可以分成校验、准备和解析三步,除了解析外,其它步骤是严格按照顺序完成的。各个步骤的主要工作如下: * ...

    Java虚拟机类装载机制

    ClassLoader是一个抽象类,它有多个子类,如BootstrapClassLoader(引导类加载器)、ExtensionClassLoader(扩展类加载器)和AppClassLoader(应用程序类加载器)。每个类加载器都有自己的职责范围,如...

    ClassLoader in OSGI

    - `ExtClassLoader's father classLoader is: null`:扩展装载器的父加载器为启动类加载器`BootstrapClassLoader`,由于后者不是标准的Java类,因此显示为`null`。 #### 三、ClassLoader装载策略 从Java 1.2版本...

    java ClassLoader机制及其在OSGi中的应用

    在该模型下,当一个ClassLoader收到加载类的请求时,它首先会委托父加载器去尝试加载,只有当父加载器无法加载时,当前加载器才会尝试自己加载。这样设计避免了类的重复加载,并确保了核心类库的唯一性。 四、...

Global site tag (gtag.js) - Google Analytics