`

java类加载的过程

    博客分类:
  • JVM
JVM 
阅读更多

一、类加载器

       类加载器是JVM执行类加载机制的前提,其主要任务为根据一个类的全限定名来读取 此类的二进制字节流到JVM内部,然后转换为一个与目标类对应的java.lang.Class对象实例;

        类加载器:ClassLoader

        ①ClassLoader除了将Class加载到JVM之外,还有一个重要的作用就是审查每个类应该有谁加载,它是一种父优先的等级加载机制;

        ②ClassLoader还有一个重要的作用就是将Class字节码重新解析成JVM统一要求的对象格式;

        ClassLoader主要包括defineClass(),findClass(),loadClass(),resolveClass()几个方法:

        defineClass方法 的主要作用是将byte 字节流解析成JVM能够识别的class对象,这个方法意味着 我们不仅仅可以通过class文件去实例化对象,还可以其他方式实例化对象,例如我们通过网络接收到一个类的字节码;defineClass的代码如下:

 protected final Class<?> defineClass(String name, byte[] b, int off, int len,
                                         ProtectionDomain protectionDomain)
        throws ClassFormatError
    {
        protectionDomain = preDefineClass(name, protectionDomain);
        String source = defineClassSourceLocation(protectionDomain);
        Class<?> c = defineClass1(name, b, off, len, protectionDomain, source);
        postDefineClass(c, protectionDomain);
        return c;
    }


    protected final Class<?> defineClass(String name, java.nio.ByteBuffer b,
                                         ProtectionDomain protectionDomain)
        throws ClassFormatError
    {
        int len = b.remaining();

        // Use byte[] if not a direct ByteBufer:
        if (!b.isDirect()) {
            if (b.hasArray()) {
                return defineClass(name, b.array(),
                                   b.position() + b.arrayOffset(), len,
                                   protectionDomain);
            } else {
                // no array, or read-only array
                byte[] tb = new byte[len];
                b.get(tb);  // get bytes out of byte buffer.
                return defineClass(name, tb, 0, len, protectionDomain);
            }
        }

        protectionDomain = preDefineClass(name, protectionDomain);
        String source = defineClassSourceLocation(protectionDomain);
        Class<?> c = defineClass2(name, b, b.position(), len, protectionDomain, source);
        postDefineClass(c, protectionDomain);
        return c;
    }

        defineClass()通常是和findClass()一起使用,我们可以通过覆盖父类中的findClass 方法来实现类的加载规则,从而取得加载类的字节码,然后调用defineClass方法生成的Class对象;

 

二、如何加载Class文件

        ClassLoader加载一个class文件到 JVM中,需要经过以下的步骤:

        .class文件----->findClass------>验证、准备、解析----->初始化------>卸载

        即:加载---->连接----->初始化---->卸载

       ①找到.class文件并把这个文件包含的字节码加载到内存中;

       ②字节码验证、Class类数据结构分析及相应的内存分配和最后符号表的链接;

       ③类中静态属性和初始化赋值,以及静态块的执行;

        加载字节码到内存:

        抽象类ClassLoader通过findClass找到指定类并把他的 字节码加载到内存需要的子类中去实现;

        验证:

        验证阶段JVM所执行的一系列验证大概分为:格式验证、语义验证、操作验证、符号引用验证;

        格式验证的主要任务就是检查当前正在加载的字节码文件是否符合JVM规范 ,是否是一个有效的字节码文件,格式验证的主要任务是检查当前正在加载的字节码文件中的前四个字节是否是0xCAFEBABE;

        语义验证:验证字节码信息是否符合java语法规范;

        操作验证:JVM会对类型的方法执行验证,以确保一个类的方法在执行时,不会对JVM产生不良影响不会因此导致JVM的进程出现崩溃;

        符号引用验证:对常量池中的各种符号引用执行验证;

        准备阶段:

        对存放在方法区 中类数据信息的类变量执行初始化,这里所执行 的初始化操作并非是指类加载阶段中的初始化操作,这里仅仅是为类中的所有静态变量分配内存空间,并为其设置一个初始值,而非用户手动执行赋值操作;

        解析阶段:

        主要任务是将字节码常量池中的符号引用全部转换为直接引用,包括类、接口、方法和字段的符号引用。

        初始化:

        在 这个阶段中,JVM会将一个类中所有被static关键字标示的代码统统执行一遍,如果执行的是静态常量,那么用户将会使用用户指定的值覆盖掉之前在准备阶段中JVM为其设置的初始值,如果程序中并没有为静态变量显式指定赋值操作,那么 所持有的值仍然是之前的初始值;反之如果执行的是static代码块,那么在初始化阶段中,JVM就将会执行static代码块中定义的所有操作;

分享到:
评论

相关推荐

    java类加载过程详解.doc

    java类加载过程详解

    Java虚拟机类加载顺序

    Java虚拟机类加载顺序,Java虚拟机类加载顺序,Java虚拟机类加载顺序

    深入理解Java 类加载全过程

    主要介绍了深入理解Java 类加载全过程的相关资料,需要的朋友可以参考下

    Java类加载基本过程详细介绍

    主要介绍了Java类加载基本过程详细介绍的相关资料,需要的朋友可以参考下

    java类加载机制.xmind

    该文件是JVM中关于类加载机制的知识整理的思维导图,包括类加载机制概述、类加载的生命周期、加载时机、加载过程、类加载、类的初始化和实例化等几个大方面进行了讲解,其中类加载中还对JVM三种预定义类加载器进行了...

    Java虚拟机----类的加载过程.docx

    Java虚拟机----类的加载过程.docx

    详解JAVA类加载机制(推荐)

    JAVA源码编译由三个过程组成: 1、源码编译机制。 2、类加载机制 ...系统可能在第一次使用某个类时加载该类,也可能采用预加载机制来加载某个类,当运行某个java程序时,会启动一个java虚拟机进程,两次运行

    Java类加载初始化的过程及顺序

    今天小编就为大家分享一篇关于Java类加载初始化的过程及顺序,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

    深入理解java类加载机制

    本资源主要介绍了Java字节码和类加载的详细过程。字节码是Java程序在编译之后的中间代码表现形式。而类加载是Java程序执行过程中的一个重要的组成部分,它实现了程序的动态加载和运行。 在字节码方面,我们将从Java...

    深入探讨 Java 类加载器

    类加载器(class ...本文首先详细介绍了 Java 类加载器的基本概念,包括代理模式、加载类的具体过程和线程上下文类加载器等,接着介绍如何开发自己的类加载器,最后介绍了类加载器在 Web 容器和 OSGi™ 中的应用。

    Java类加载机制.pdf

    java的类加载机制,类加载顺序,类加载的体系结构,类加载过程,双亲委派模型及机制等相关内容。做架构师或者高级开发,类加载是必须要掌握的内容。

    分析Java类加载全过程

     一个java文件从被加载到被卸载这个生命过程,总共要经历4个阶段:  加载-&gt;链接(验证+准备+解析)-&gt;初始化(使用前的准备)-&gt;使用-&gt;卸载  其中加载(除了自定义加载)+链接的过程是完全由jvm负责的,什么...

    深入探讨 Java 类加载器.pdf

    类加载器(class ...本文首先详细介绍了 Java 类加载器的基本概念,包括代理模式、加载类的具体过程和线程上下文类加载器等,接着介绍如何开发自己的类加载器,最后介绍了类加载器在 Web 容器和 OSGi™ 中的应用。

    java 类加载器学习笔记1

    /** * java类加载器 * 类加载器负责加载与连接,这个过程是在运行时进行的,这种机制为java提供极大的灵活性 * * 类的生命周期 * class文件

    T8.3_类加载过程 java 经典教程 经典教材

    T8.3_类加载过程 java 经典教程 经典教材

    Java中类加载过程全面解析

    主要介绍了Java中类加载过程全面解析,具有一定参考价值,需要的朋友可以了解下。

    java面试题静态加载顺序构造方法

    4.知道了static的作用,那么X类被加载,那么就会先执行X类的静态属性和静态语句块(static),执行先后顺序看谁在前面就先执行谁。只在此时执行,以后都不会。 5.所以一个输出结果为tttt,没问题了吧。 6.X类的...

    JVM类加载过程.pptx

    JVM类加载过程

    java类热加载

    实现对代码的动态更新,只需要上传覆盖原class文件即可在不停止项目的过程中更新代码

    深入理解Java类加载.docx

    虚拟机把描述类的数据从 Class 文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的 Java 类型,这就是虚拟机的类加载机制。 在Java语言里面,类型的加载、连接和初始化过程都是在...

Global site tag (gtag.js) - Google Analytics