资讯专栏INFORMATION COLUMN

类加载器和类的加载过程

baiy / 1561人阅读

摘要:只有当父加载器无法完成加载的时候,子加载器才会尝试自己加载。破坏双亲委托机制实现热部署

类加载器:

负责将生成的.class文件加载到内存中,并生成对应的Class对象
三种类加载器:
    BootStrapClassLoader:引导类加载器,负责java核心类的加载
    ExtensionClassLoader: 扩展类加载器
    AppClassLoader:应用类加载器    负责加载我们写的一些类

类加载概述:

当程序要使用某个类的时候,如果该类还没有被加载到内存中,
系统会通过加载、连接和初始化三步来实现对该类的初始化。
    加载:将class文件中的二进制数据数据读入到内存中,
    然后将该字节流所代表的静态存储结构转换为方法区中运行的数据结构,
    最终创建一个Class对象,任何类使用时系统都会创建该类的Class对象
连接:
    验证:确保class文件中字节流包含的信息符合当前虚拟机的要求
        文件格式的验证:验证是否符合Class文件格式的规范
        元数据的验证:对字节码描述的信息进行语法校验
        字节码验证:验证程序的控制流程
        符号引用验证:发生在虚拟机将二进制符号转换为直接引用的时候 
    准备:为类变量分配内存并设置初始值。这些变量使用的内存都在方法区中分配。        
        这时候分配的内存仅包括类变量(静态变量),实例变量会在对象实例化的时候        
        随着对象一起分配在堆内存中
    解析:将二进制符号的引用替换为直接引用
    初始化:父类静态(静态的成员变量,静态代码块),
        子类静态(子类静态成员变量,子类的静态代码块)
        父类非静态(非静态成员变量,构造代码块,构造函数)
        子类非静态(子类非静态成员变量,子类构造代码块,子类构造函数)
    

静态语句块只能访问定义到静态语句块之前的变量,定义在之后的变量,只能够赋值,不能够访问

static{
    num = 100;
    System.out.println(num);//编译不通过
}
private static int num = 10;
    

类加载器的加载机制:

双亲委托机制
当一个类加载器调用loadClass之后,并不会直接加载,
而是先交给当前类加载器的父加载器加载,直到最顶层的父加载器。
只有当父加载器无法完成加载的时候,子加载器才会尝试自己加载。
破坏双亲委托机制:实现热部署

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/70360.html

相关文章

  • 乐字节Java反射之三:方法、数组、加载器和的生命周期

    摘要:本文承接上一篇乐字节发射之二实例化对象接口与父类修饰符和属性继续讲述反射之三方法数组类加载器一方法获取所有方法包括父类或接口,使用即可。当没有任何引用指向对象时就会被卸载,结束类的生命周期。 本文承接上一篇:乐字节Java发射之二:实例化对象、接口与父类、修饰符和属性 继续讲述Java反射之三:方法、数组、类加载器 一、方法 获取所有方法(包括父类或接口),使用Method即可。sho...

    ChanceWong 评论0 收藏0
  • java加载机制

    摘要:在加载阶段,虚拟机要完成件事情通过一个类的全限定名来获取定义此类的二进制字节流。前面的阶段中,除了加载的时候,可以由用户指定自定义类加载器之外,别的都是由虚拟机主导控制。 java类加载机制 代码编译的结果从本地机器码转变为字节码,是存储格式发展的一小步,确实编程语言发展的一大步 虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直...

    garfileo 评论0 收藏0
  • JAVA加载机制全解析

    摘要:当程序使用某个类时,如果该类还没被初始化,加载到内存中,则系统会通过加载连接初始化三个过程来对该类进行初始化。一旦一个类被加载到中之后,就不会再次载入了。它既可以从本地文件系统获取二进制文件来加载类,也可以远程主机获取二进制文件来加载类。 当程序使用某个类时,如果该类还没被初始化,加载到内存中,则系统会通过加载、连接、初始化三个过程来对该类进行初始化。该过程就被称为类的初始化 类加载 ...

    tomener 评论0 收藏0
  • JVM 知识点 01

    摘要:新生代又被划分为三个区域和两个幸存区。这样划分的目的是为了使能够更好地管理堆内存中的对象,包括内存的分配及回收。新生代主要存储新创建的对象和尚未进入老年代的对象。 在Java中主要有以下三种类加载器: 引导类加载器(bootstrap class loader) --用来加载java的核心库(Strin...

    不知名网友 评论0 收藏0
  • 虚拟机加载机制

    摘要:加载阶段在类的加载阶段,虚拟机需要完成以下件事情通过一个类的全限定名来获取定义此类的二进制字节流。验证阶段验证是连接阶段的第一步,这一阶段的目的是为了确保文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。 注:本篇文章中的内容是根据《深入理解Java虚拟机--JVM高级特性与最佳实践》而总结的,如有理解错误,欢迎大家指正! 虚拟机把描述类的数据从Class文件...

    k00baa 评论0 收藏0

发表评论

0条评论

baiy

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<