类加载(基本说明、流程图、类加载各个阶段完成的任务)
目录
基本说明
类加载过程流程图
类加载各阶段完成的任务
加载阶段
编辑
连接阶段-验证
连接阶段-准备
连接阶段-解析
Initialization(初始化)
类加载就是当字节码文件有了过后,进行下一步工作,不管是创建对象,还是干其他事情,都是有一个类加载器,把字节码加载到堆,并生成一个Class对象,同时在方法区生成类的二进制数据(元数据)。
基本说明
举例说明:
静态加载,编译的时候,也就是还没运行的时候,加载相关的类,如果没有就会报错,这种静态加载,依赖性是比较强的。
case "2" 里会去加载Person类,但是因为这里用的是反射,反射是动态加载,因为没有执行到这里来,不会真的去加载Person类
而case "1" 的加载类是静态加载,依赖性很强,在编译的时候就要把它加载进去,看他符不符合语法的规范,如果不符合,直接报错,或者Dog类写的有问题也会报错。
因为new Dog()是静态加载,因此必须编写Dog类
而Person类是动态加载,所以没有编写Person类也不会报错,只有当动态加载该类时,才会报错。
这时候我们在里面编写一个Dog类
这时候就不会进行报错了。
那么什么时候会导致动态加载报错?只有我们输入2的时候,走到这段代码的时候,它会发现根本没有Person,这个时候就会报出异常。
所以动态加载可以认为是一种延时加载,静态加载在编译的时候就已经在加载了。
这是我们输入2的时候,才走到这段代码,会发现没有Person,这时候就会报错。解决这种动态报错,就是我们需要写一个Person类
那么这时候找到Person类,用反射机制创建一个Person对象,然后这个Method对象用反射机制调用也是OK的
总结:
总的来说,静态加载就是在编译的时候就会加载相关的类,它会检查你的类是否正确,各方面会去检测。
而动态加载是执行到这一段的时候才会加载,如果运行的时候没有用到这个类,即使不存在也不会报错,这样就降低了一定的依赖性。
类加载过程流程图
第一步是先写源代码,源代码编译就得到字节码文件,字节码文件运行,运行的时候就会把字节码文件进行类加载,这里分成三个阶段。
第一个就是加载(Loading)
加载完的第二个阶段就是进入连接(Linking),连接里面又分成验证,准备,解析。
验证阶段主要是对文件进行安全的校验,比如说文件格式是否正确,再比如说元数据是否正确,字节码等是否正确,符号引用是否OK。
准备阶段主要是对静态变量进行分配内存,默认初始化,而且是针对静态变量而言。
解析阶段主要的功能是虚拟机会将常量池中的符号引用替换为直接引用。
下一步才会进行初始化,到这个阶段,才会真正的执行在类中去定义的Java代码,比如说静态代码块等。
当我们加载完成以后,在内存中会产生2个重要部分。一个是方法区,会把字节码,以二进制的形式保存起来。这个就是元数据,真正定义的方法,访问权限,变量详细信息都是在这里。同时在堆区生成字节码对应的数据结构,就是类的Class对象,这里面就是数据结构,是数据的访问入口。
类加载各阶段完成的任务
加载阶段
加载和连接阶段其实是由JVM机来控制的,我们是无法控制的,初始化是我们程序员可以指定的。
连接阶段-验证
连接阶段-准备
ClassLoad02.java
class A{//属性-成员变量-字段//分析类加载的链接阶段-准备 属性是如何处理的/*** 1. n1是个实例属性,不是静态变量,因此在准备阶段是不会分配内存的* 2. n2是个静态变量,这里就会分配内存,n2是默认初始化,这个默认初始化是0,还没到20,他在初始化这个阶段才会真正执行代码,但是内存确实分配了* 3. n3是个static final 是个常量,它和静态变量就不一样了,一但赋值就不变,所以n3在准备阶段就是30了,不是0.*/public int n1 = 10;public static int n2 = 20;public static final int n3 = 30;
}
A类里面写了3个属性,n1,n2,n3。
那么这3个属性在类的准备阶段是怎么处理的呢?
n1是个实例属性,不是静态变量,因此在准备阶段是不会分配内存的
n2是个静态变量,这里就会分配内存,n2是默认初始化,这个默认初始化是0,还没到20,他在初始化这个阶段才会真正执行代码,但是内存确实分配了
n3是个static final 是个常量,它和静态变量就不一样了,一但赋值就不变,所以n3在准备阶段就是30了,不是0。
连接阶段-解析
Initialization(初始化)
package com.godairo.reflection.classload_;/*** @author GodAiro* Creation Time: 2022/7/18 10:34.* 演示类加载-初始化*/
@SuppressWarnings({"all"})
public class ClassLoad3 {public static void main(String[] args) {/*** 分析* 1. 加载B类,,并生成B类的class对象* 2. 链接 num=0* 3. 初始化阶段* 依次收集类中的所有静态变量的赋值动作和静态代码块中的语句,按顺序收集,并进行合并* clinit(){* System.out.println("B 静态代码块被执行");* num=300;* num=100; * } * 合并后:num=100,num=300就没什么意义了。 */System.out.println(B.num); //这里需要注意的是 我们是B.num,没有去new一个B对象,所以构造器是不会执行的}
}class B{static{System.out.println("B 静态代码块被执行");num=300;}static int num=100;public B(){System.out.println("B() 构造器被执行");}}
看代码中注释
这是new一个B出来
System.out.println("=======new B()之后=======");
B b = new B();
System.out.println(B.num);构造器也一起执行了。
类加载(基本说明、流程图、类加载各个阶段完成的任务)相关推荐
- ccs加载out文件_类加载流程、类加载机制及自定义类加载器详解
原文:juejin.im/post/5cffa528e51d4556da53d091 一.引言 当程序使用某个类时,如果该类还未被加载到内存中,则JVM会通过加载.链接.初始化三个步骤对该类进行类加载 ...
- 请你详细说说类加载流程,类加载机制及自定义类加载器
一.引言 当程序使用某个类时,如果该类还未被加载到内存中,则JVM会通过加载.链接.初始化三个步骤对该类进行类加载. 二.类的加载.链接.初始化 1.加载 类加载指的是将类的class文件读入内存,并 ...
- 《Java虚拟机原理图解》5. JVM类加载器机制与类加载过程
参考网址:http://blog.csdn.net/luanlouis/article/details/50529868 0.前言 读完本文,你将了解到: 一.为什么说Jabalpur语言是跨平台的 ...
- JVM类加载理解(线程上下文类加载器、Tomcat类加载器)
类加载机制概念 Java虚拟机把描述类的class文件加载到内存,对其进行校验.转换解析.初始化等操作,最终得到可以被虚拟机直接使用的java类型,这就是虚拟机的加载机制. 主要有五个步骤: 加载 将 ...
- java类加载机制、类加载器、自定义类加载器
类加载机制 java类从被加载到JVM到卸载出JVM,整个生命周期包括:加载(Loading).验证(Verification).准备(Preparation).解析(Resolution).初始化( ...
- OSGi 规范和框架 OSGi框架类加载机制 Java默认类加载器机制和OSGI类加载器机制比较
一.OSGi 规范 OSGi(Open Service Gateway Initiative) 技术是 Java 动态化模块化系统的一系列规范.OSGi 一方面指维护 OSGi 规范的 OSGi Al ...
- Java类加载器及Android类加载器基础
引子 Android插件化与热更新技术日渐成熟,当你研究这些技术时会发现类加载器在其中占据重要地位.Java语言天生就有灵活性.动态性,支持运行期间动态组装程序,而这一切的基础就是类加载器. Java ...
- 【Android 逆向】类加载器 ClassLoader ( 启动类加载器 | 扩展类加载器 | 应用类加载器 | 类加载的双亲委托机制 )
文章目录 一.类加载器 二.类加载的双亲委托机制 一.类加载器 Java 虚拟机 ClassLoader 类加载器 : Bootstrap ClassLoader : 启动类加载器 , 该 加载器由 ...
- 自定义类加载器在复杂类加载情况下的运行分析
在之前咱们都在研究自定义类加载器的一些东东,不过接一来的学习还会依托于之前咱们写的MyTest16这个自定义类加载器,这里先再回顾一下: public class MyTest16 extends C ...
- java 类加载器 解密_JAVA类加载器总结整理
一.What(是什么?) 1.概念 Java类加载器是Java运行时环境的一部分,负责动态加载Java类到JVM的内存空间中.每个Java类必须由某个类加载器装入到内存中.每一个类加载器都有一个父类加 ...
最新文章
- 百度SLG拿下前锤子科技CTO钱晨,还要合并小鱼在家? | 极客头条
- Bound Services
- java中字符串(1)
- Android近场通信---NFC基础(一)
- Python+tkinter打造类似于IDLE的代码编辑器(83行源码)
- JetBrains发布Toolbox 采用新的订阅模式
- [IOS Tableview] cell自定义view显示错误问题
- CDN实战:访问苹果开发者网站太慢、访问github太慢
- DisplayTag汉化
- 10GE DWDM SFP+彩色光模块应用案例
- Godaddy怎么解析域名指向自己的服务器?
- 关于WinNT和WinCE中使用NTP协议
- Beetl的配置的最基本元素
- 【运筹学】(2)—预测
- 福昕阅读器中,如何令两个pdf文件分别在两个不同的窗口显示?
- easypoi的使用(Word、Excel基于模板的导出)
- 2023 hnust 湖南科技大学 大三下 人工智能导论课程 期中考试复习笔记
- 血族 第一季 The Strain Season 1 (2014)
- 字扩展,位扩展和字位扩展
- java 恶汉和懒汉_Java单例模式-懒汉式、恶汉式与线程安全问题
热门文章
- CSS3 empty伪类(:empty)
- 鸿蒙轻量设备侧Camera应用中的Surface使用
- 我所经历的大数据平台发展史(三):互联网时代 • 上篇
- 麻雀要革命 第柒战 惨败!四面楚歌的凄凉绝境 第五节
- 1核2g1m服务器能支持多少人在线访问?
- 计算机启动后没有桌面,电脑开机后桌面上什么都没有是为什么,怎么办
- Javascript深入浅出之闭包
- day01_xUtils+注解+动画
- java switch枚举类,Java 枚举 switch的用法
- 串口屏之------Usart GPU 使用手册