`

Java之 ClassLoader 和 class 加载过程

阅读更多
Java 的 Class 加载 步骤

一、背景知识
       
1. java.lang.ClassLoader类介绍
   
    <Abstract> java.lang.ClassLoader
   
    java.lang.ClassLoader 类的基本职责就是根据一个指定的类的名称,找到其对应的二进制字节代码文件。
    然后根据这个文件,生成一个 java.lang.Class 类的实例。
   
    - part of methods in java.lang.ClassLoader

// 1.   
// get parent class loader.      
public   java.lang.ClassLoader        getParent()                 

// 2.
// load a class according its binary name,
// return a class instance.
public   java.lang.Class<T>           loadClass(String name)

// 3.
// Converts an array of bytes into an instance of class Class. 
protected final java.lang.Class<T>    defineClass(String name, byte[] b, int off, int len)  

//

       
       
2. JVM中类加载器的树状层次结构

    1) 引导类加载器(bootstrap class loader):
        它用来加载 Java 的核心库(jre/lib/rt.jar)。
        是用原生C++代码来实现的,并不继承自java.lang.ClassLoader。
   
    2) 扩展类加载器(extensions class loader) :继承自 1)
        它用来加载 Java 的扩展库(jre/ext/*.jar)。
        Java 虚拟机的实现会提供一个扩展库目录。该类加载器在此目录里面查找并加载 Java 类。
   
    3) 系统类加载器(system class loader):继承自 2)
        它根据 Java 应用的类路径(CLASSPATH)来加载 Java 类。
        一般来说,Java 应用的类都是由它来完成加载的。
        可以通过 java.lang.ClassLoader.getSystemClassLoader()来获取它。
       
    除了系统提供的类加载器以外,开发人员可以通过继承
    java.lang.ClassLoader类的方式实现自己的类加载器,以满足一些特殊的需求。   



public class TestMClassLoader {
    
    public static void main(String[] args) throws Exception{
        
        //current class loader.
        System.out.println(TestMClassLoader.class.getClassLoader());
        
        //application class loader
        System.out.println(ClassLoader.getSystemClassLoader());        
        //extensions class loader
        System.out.println(ClassLoader.getSystemClassLoader().getParent());        
        //bootstrap class loader
        System.out.println(ClassLoader.getSystemClassLoader().getParent().getParent());
        
    }

}


/*
output:

sun.misc.Launcher$AppClassLoader@3e0ebb

sun.misc.Launcher$AppClassLoader@3e0ebb
sun.misc.Launcher$ExtClassLoader@39443f
null

*/

/*

可以看出:

ClassLoader 类是由 AppClassLoader 加载的,其父类是 ExtClassLoader 。

ExtClassLoader 的父类无法获取是因为它是用 C++ 实现的。


*/



   
3. 双亲委派机制

    某个特定的类加载器在接到加载类的请求时,首先将加载任务委托交给父类加载器。
    父类加载器又将加载任务向上委托,直到最父类加载器。
    如果最父类加载器可以完成类加载任务,就成功返回。
    如果不行就向下传递委托任务,由其子类加载器进行加载。

    双亲委派机制的好处:
        保证java核心库的安全性。
        例如:
        如果用户自己写了一个java.lang.String类就会因双亲委派机制不能被加载,
        不会破坏原生的String类的加载。

       
二、类加载过程

    JVM将类加载过程分为三个步骤:
   
    1) 装载(Load):
        查找并加载类的二进制数据。
       
    2) 链接(Link):
            语法验证:确保被加载类信息符合JVM规范、没有安全方面的问题。
          准备:为类的静态变量分配内存,并将其初始化为默认值。
          解析:把虚拟机常量池中的符号引用转换为直接引用。
                  Java 中,虚拟机会为每个加载的类维护一个常量池。
                  【不同于字符串常量池,这个常量池只是该类的字面值(
                    例如:类名、方法名)和符号引用的有序集合。
                    而字符串常量池,是整个JVM共享的】
                  这些符号(如int a = 5; 中的 a )就是符号引用,
                  而解析过程就是把它转换成指向该类在堆中生成的对象地址的相对地址。
       
    3) 初始化(Initialize):
        为类的静态变量赋予正确的初始值。           
        步骤:
        1>. 如果这个类还没有被加载和链接,那先进行加载和链接。
        2>. 假如这个类存在直接父类,并且该父类还没有被初始化(
            注意:在一个类加载器中,类只能初始化一次),
            那么先初始化其直接的父类(不适用于接口)
        3>. 如果类中存在 static 语句块,那就依次执行这些初始化语句。







-
引用:

- 全面解析Java类加载器
http://www.cnblogs.com/sunniest/p/4574080.html


 




-

分享到:
评论

相关推荐

    Java实现热加载完整代码;Java动态加载class;Java覆盖已加载的class;Java自定义classloader

    让Java支持热加载是个不错的想法。如何做到的呢? 1. 定义好接口和实现类 2. 让代理类通过反射的方式调用实现类,对外暴露的是代理类。...Java动态加载class; Java覆盖已加载的class; Java自定义classloader;

    使用classloader动态加载Class

    Java中的类加载过程分为三个主要阶段:加载、验证、准备、解析和初始化。ClassLoader主要关注的是加载阶段,它根据全限定名(如"java.lang.String")找到对应的.class文件,并将其转换为Class对象。Java提供了三个...

    Java ClassLoader定制实例

    在Java编程语言中,ClassLoader是一个至关重要的组成部分,它负责加载类到JVM(Java虚拟机)中。理解ClassLoader的工作原理以及如何定制它,对于深入学习Java的运行机制和进行高级应用开发具有重要意义。本篇文章将...

    Java类动态加载(一)——java源文件动态编译为class文件

    通过自定义ClassLoader和利用`JavaCompiler` API,我们可以实现Java源文件的动态编译和加载,从而实现程序运行时的灵活扩展。在实际应用中,我们需要注意类加载的性能影响,以及类加载器之间的隔离问题,以确保系统...

    java中classLoader的使用

    Java中的类加载器(ClassLoader)是Java虚拟机(JVM)的一个重要组成部分,它负责将类的.class文件从文件系统或者网络中加载到内存中,并转换为对应的Class对象。类加载器的工作流程主要包括加载、验证、准备、解析...

    ClassLoader类加载机制和原理详解

    在Java编程语言中,ClassLoader是核心组件之一,它负责加载类到JVM(Java虚拟机)中执行。本文将深入探讨ClassLoader的工作原理和类加载机制,帮助开发者理解这个至关重要的概念。 1. 类加载机制概述 Java的类加载...

    java中ClassLoader

    4. 自定义类加载器:通过继承 java.lang.ClassLoader 类的方式实现自己的类加载器,用户自定义 ClassLoader 可以根据用户的需要定制自己的类加载过程,在运行期进行指定类的动态实时加载。 ClassLoader 的层次结构...

    ClassLoader类加载器

    总结来说,ClassLoader是Java运行时环境的重要组件,它按照委托模型加载类,提供了扩展和自定义的可能性。理解和掌握ClassLoader的工作原理以及如何自定义,对于提升Java应用的灵活性和安全性具有重要意义。

    java classloader

    ClassLoader的工作流程包括查找、加载和验证。当一个类被请求加载时,ClassLoader首先检查该类是否已经被加载。如果未加载,它会根据类的全名(包括包名)来寻找对应的.class文件。这个过程通常涉及到从文件系统或...

    Java_ClassLoader详解

    在 Java 语言中,类加载器(ClassLoader)是 Java 运行时环境的核心组成部分之一,它负责将编译后的 `.class` 文件加载到 JVM 中执行。从 JDK 1.0 开始,随着 Java Applet 的出现以及网络应用的需求增加,类加载机制...

    java classloader classpath 张孝祥

    ### Java ClassLoader与ClassPath详解 #### 一、概述 在Java编程中,类加载机制是十分关键的一个环节。类加载器(`ClassLoader`)负责将...理解这些概念有助于开发者更好地管理和控制程序中的类和资源的加载过程。

    Java ClassLoader学习总结

    JVM 首先启动 bootstrap classloader,该 ClassLoader 加载 Java 核心 API,然后调用 ExtClassLoader 加载扩展 API,最后 AppClassLoader 加载 CLASSPATH 目录下定义的 Class,这就是一个程序最基本的加载流程。...

    Java 类加载机制 ClassLoader Class.forName.pdf

    3. **Application ClassLoader** 的搜索路径由`System.getProperty("java.class.path")`指定,包含了应用程序类的路径。 #### 四、类加载器的特点与获取 ##### 4.1 特点 1. **类加载委托机制**: 每个类加载器在...

    ClassLoader(类加载机制)1

    Java类加载过程分为三个阶段:加载、链接和初始化。`ClassLoader`在加载阶段发挥作用,它负责查找并加载类的字节码。在Java中,类加载器主要有三层:Bootstrap ClassLoader(引导类加载器)、Extension ClassLoader...

    动态编译字符串成java,并且添加class到jvm

    默认的`ClassLoader`无法加载内存中的`.class`,所以我们需要自定义一个`ClassLoader`,覆盖`findClass()`方法,从内存中读取`.class`字节码。 8. **创建并执行实例**: 使用`Class.forName()`加载类后,可以调用`...

    java应用程序类加载器,ClassLoader for java Application

    在压缩包文件`javalauncher`中,可能包含了一个用于启动Java应用程序的自定义类加载器或者类加载辅助工具,帮助开发者更好地管理类的加载过程。这类工具通常会提供更方便的命令行参数,以便于指定类路径、加载特定的...

    理解Java ClassLoader机制

    Java ClassLoader机制是Java运行时环境中的核心组件之一,它负责加载类到JVM(Java虚拟机)中,使得程序能够执行。理解ClassLoader的工作原理对于优化应用性能、处理类加载问题以及实现自定义加载器至关重要。 首先...

Global site tag (gtag.js) - Google Analytics