上一篇文章无法掌握,但是有必要了解类文件实际上是二进制文件的字节代码文件的整体结构。那么我们如何将二进制流加载到JVM?
类负载基本分为3个主要步骤,加载,链接(链接),初始化(初始化)和链接分为3个步骤,即验证,准备和分辨率。基本过程如下所示。
定义:通过类的完整限制名称(路径+文件名)获取此类二进制流(字节码文件),将二进制流传输到方法区域的数据结构中,并同时创建类对象
加载工具:ClassLoader,包括Bootstrap,Extens,App,自定义加载程序。
加载方法:父委派
加载过程
(互联网图片)
简要描述;简介
BootstrapClassLoader:由C ++实现。它被Java中的null取代。只有最基本和最重要的类,例如JRE LIB目录的JRB目录中的JAR包中的类,以及由虚拟机parameter-XbootClassPath指定的类。
ExtClassLoader:其父亲加载程序是BootstrapClassloader,加载相对次要但普通类,例如JRE LIB/EXT Directory中的JAR包装类,以及由Java.ext.dirs指定的类(Java 9,加载更多类别)
AppClassLoader:其父亲加载程序是ExtClassLoader,在应用程序路径下加载类。
CustomClassLoader:定制加载程序可以实现一种特殊的加载方法,例如加密类文件。加载时,自定义加载程序被解密并加载。
父母双方都任命了加载的源代码
为什么需要使用两个父母的约会?(经常提出问题)
为了安全性,假设攻击者对系统级别进行了篡改,例如java.lang.string.class,而无需加载,他会默认情况下询问BootstrapClassloader,而BootstrapClassloader已加载字符串。。
如何打破约会?
只要自定义类加载程序重新连接LOADCLASS方法,它就可以打破双党。从本质上讲,自定义的类加载程序仅re -findClass方法不会破坏吊坠预约。对于详细的简介,您可以阅读本文:如何中断:任命双边评估
类加载时间
JVM加载类使用懒惰加载,几个常见场景:
验证类文件的字节流以满足虚拟机的要求,以确保加载类的正确性。
分配静态变量的内存,并将静态变量设置为初始值(零值)
将常数池中的符号转换为直接参考内存中的参考
执行临床方法以执行所有静态变量和静态代码块的语句(按原始文件中的语句顺序执行),并将静态变量设置为初始值。
原始:https://juejin.cn/post/7098264829915299847