问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Class文件如何加载到JVM

发布网友 发布时间:2024-10-02 12:39

我来回答

1个回答

热心网友 时间:2024-11-15 03:06

概述

上一篇可以不用掌握,但必须了解字节码文件的整体结构中提到了class文件其实就是二进制流,那么我们如何把二进制流加载到JVM中?今天来学一下类的加载

类加载基本分为3大步,loading(加载),linking(链接),initializing(初始化),linking又分为3步,分别是verification(验证),preparation(准备),resolution(解析)。基本流程如下图

Loading

定义:通过类的全限定名(路径+文件名)获取此类的二进制流(字节码文件),将二进制流转为方法区的运行时数据结构,同时创建class对象,作为此类的访问入口

加载工具:ClassLoader,有bootstrap,extention,app,custom加载器。

加载方式:parent delegating(双亲委派)

加载流程

(图片来源于网络)

流程简述

当加载类(假设为test)时,CustomClassLoader查询是否加载过test,是的话,直接返回,否则问父加载器AppClassLoader

AppClassLoader查询是否加载过test,是的话,直接返回,否则问父加载器ExtClassLoader

ExtClassLoader查询是否加载过test,是的话,直接返回,否则问父加载器BootstrapClassLoader

BootstrapClassLoader查询是否加载过test,是的话,直接返回,否则查看自己是否可以加载,是的话,加载并返回,否的话,则让ExtClassLoader去加载

ExtClassLoader查看自己是否可以加载,是的话,加载并返回,否的话,则让AppClassLoader去加载

AppClassLoader查看自己是否可以加载,是的话,加载并返回,否的话,则让CustomClassLoader去加载

CustomClassLoader查看自己是否可以加载,是的话,加载并返回,否的话,则抛出ClassNotFundException

BootstrapClassLoader:由C++实现,在Java中用null来指代,只加载最基础最重要的类,例如JRE的lib目录下jar包中的类以及有虚拟机参数-Xbootclasspath指定的类。

ExtClassLoader:其父加载器是BootstrapClassLoader,加载相对次要但通用的类,例如JRE的lib/ext目录下jar包的类,以及java.ext.dirs指定的类。(java 9 之后,改名为平台类加载器,加载更多类)

AppClassLoader:其父加载器是ExtClassLoader,加载应用程序路径下的类。

CustomClassLoader:自定义加载器,可实现特殊的加载方式,例如对class文件加密,加载时利用自定义的类加载器进行解密后加载。

双亲委派加载的源码

protected Class<?> loadClass(String name, boolean resolve)throws ClassNotFoundException{synchronized (getClassLoadingLock(name)) {// First, check if the class has already been loadedClass<?> c = findLoadedClass(name);if (c == null) {long t0 = System.nanoTime();try {//缓存中没查到,则请求父类尝试加载if (parent != null) {c = parent.loadClass(name, false);} else {//最顶级父类bootstrapClassLoader加载c = findBootstrapClassOrNull(name);}} catch (ClassNotFoundException e) {// ClassNotFoundException thrown if class not found// from the non-null parent class loader}//父类中既没有缓存,也无法加载,则当前classloader尝试加载if (c == null) {// If still not found, then invoke findClass in order// to find the class.long t1 = System.nanoTime();//自定义classLoader只能重写findClass方法c = findClass(name);// this is the defining class loader; record the statssun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);sun.misc.PerfCounter.getFindClasses().increment();}}if (resolve) {resolveClass(c);}return c;}}

为什么需要用双亲委派? (常问面试题)

为了安全性,假设攻击者篡改系统级别的类,例如java.lang.String.Class,在未加载的情况下,会默认先轮询到bootstrapClassLoader,而bootStrapClassLoader已经加载过String.class了,并不会加载篡改后的class。

如何打破双亲委派?

自定义类加载器只要重新loadClass方法,即可以打破双亲委派。一般自定义类加载器只重新findClass方法是不会打破双亲委派的。详细介绍可以看此文:如何打破双亲委派

类的加载时机

jvm加载类采用的是懒加载,几种常见的场景:

new对象,getStatic,putStatic时

反射

初始化子类时

虚拟机启动时,主类必须加载

LINKINGverification

验证class文件的字节流符合虚拟机要求,保证被加载类的正确性。

文件格式验证:class文件开头都是CAFE BABE

元数据验证

字节码验证

符号引用验证

preparation

为静态变量分配内存,并将静态变量设置为初始值(零值)

resolution

将常量池内的符号引用转为内存中的直接引用

INITIALIZING

执行clinit方法,将执行所有静态变量和静态代码块的语句(会按照语句在原文件中的顺序进行执行),将静态变量设置为初始值。

原文:https://juejin.cn/post/7098264829915299847
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
苹果电脑电池充不进电苹果电脑充不进去电是怎么回事 苹果电脑不充电没反应苹果电脑充电指示灯不亮充不了电怎么办 狗狗更加忠诚护家、善解人意,养一只宠物陪伴自己,泰迪能长多大... 描写泰迪狗的外形和特点的句子 国外留学有用吗 花钱出国留学有用吗 !这叫什么号 百万医疗赔付后是否可以续保 前一年理赔过医疗险还能续保吗? 医疗住院险理赔后还能购买吗? "HFS"缩写为何意,它代表HTTP文件服务器? 我的游戏是在网吧考到U盘电脑是联想Y460W7系统文件名字叫现代空战一打... 韩国中央大学和建国大学哪所大学环境好? 三星一体机SF-651P显示“更换碳粉盒[停止]"aei如果不想马上更换碳... 国内认可韩国哪些大学 你好· 请问三星s5830USB接口插在电脑上总是显示硬盘出现错误无法正常运 ... 中国承认韩国哪些大学 中国认证哪些韩国大学 vivo x5max为什么把后台程序关闭就不能接收信息 我的手机型号是vivox5max,昨天我对手机进行了深度清理,之后就发现微 ... 资本主义再生产周期的物质基础是什么 农行的超级柜台是什么 赤潮过后,往往引起大量的鱼、虾、贝类的死亡,其可能原因不包括( )A... 鱼离开水便会死亡,其实质是 [ ] A.缺氧,鱼不能呼吸 B.不能游动 C... 黑米黑豆红豆粥的功效 ...的鱼,放在水里也常常会死亡,这是因为( )A.缺氧B.缺水C.体内压强增大... 鱼离开水便会死亡,其实质是( ) A.缺氧,鱼不能呼吸 B.不能游动 C.缺食... ...死亡原因是( )A.藻类大量繁殖,抢走了鱼类的营养B.水中缺 发生赤潮和水华,会造成鱼类大量死亡,原因是( ) A.缺氧或中毒 B.缺少... 尾纤SC、ST、FC、LC的区别 我是1987年阴历七月初六出生,至今不清楚自己的星座,可否请高人... 一九八七年二月初六阴历。这样的女人是否旺夫。 农历一九八七年十二月初六早上五至七点出生左手断掌算一下命运如何_百... 我唱歌唱高音时老感觉声音被压着是什么原因啊?哪位高人指点下。 ...唱心痛2009,声音一般,没用麦实唱过,跟不上伴奏,请高人指点练习... ...是自己在唱歌中觉得最适合声音!!拜托哪位高人指点一下我!!_百度知 ... YY怎么领积分换特权礼包 怎么获取YY游戏特权积分 yyt豆怎么赚 柠檬芦荟蜜雪冰城为什么不做了? 在YY每日抽奖抽中了10QB 怎么不给我啊 4天了已经 还没发放吗 YY我记得以前可以用等级积分换游戏特权卡的,为什么现在不行了,还分2... 宅家必备---几本暴爽的YY小说推荐 被投诉知识产权侵权如何办理 被投诉知识产权侵权怎么申诉的 有知识产权侵权能投诉吗 商标注册侵权该怎么处理? 1强度相对指标与平均指标相比 我想知道这个测量工具叫什么,在哪里可以买到(网上、现实中)。是测量小... c角怎么测量的?