摘要:只有当父加载器无法完成加载的时候,子加载器才会尝试自己加载。破坏双亲委托机制实现热部署
类加载器:
负责将生成的.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反射之三:方法、数组、类加载器 一、方法 获取所有方法(包括父类或接口),使用Method即可。sho...
摘要:当程序使用某个类时,如果该类还没被初始化,加载到内存中,则系统会通过加载连接初始化三个过程来对该类进行初始化。一旦一个类被加载到中之后,就不会再次载入了。它既可以从本地文件系统获取二进制文件来加载类,也可以远程主机获取二进制文件来加载类。 当程序使用某个类时,如果该类还没被初始化,加载到内存中,则系统会通过加载、连接、初始化三个过程来对该类进行初始化。该过程就被称为类的初始化 类加载 ...
摘要:新生代又被划分为三个区域和两个幸存区。这样划分的目的是为了使能够更好地管理堆内存中的对象,包括内存的分配及回收。新生代主要存储新创建的对象和尚未进入老年代的对象。 在Java中主要有以下三种类加载器: 引导类加载器(bootstrap class loader) --用来加载java的核心库(Strin...
阅读 753·2021-09-22 16:01
阅读 2058·2021-08-20 09:37
阅读 1679·2019-08-30 15:54
阅读 1673·2019-08-30 15:44
阅读 751·2019-08-28 18:23
阅读 2988·2019-08-26 12:17
阅读 992·2019-08-26 11:56
阅读 1526·2019-08-23 16:20