首页 > 编程语言 >java--类加载机制

java--类加载机制

时间:2023-04-06 16:15:18浏览次数:60  
标签:Java -- 虚拟机 JVM java 机制 加载

java--类加载机制

概述

Java是运行在Java的虚拟机(JVM)中的,但是它是如何运行在JVM中了呢?我们在IDE中编写的Java源代码被编译器编译成.class的字节码文件。然后由ClassLoader负责将这些class文件给加载到JVM中去执行。

Java从编码到执行大概流程如图:

类加载流程

当一个类收到了类加载请求,他不会直接加载类,而是通过双亲委派机制选择合适的类加载器去加载

双亲委派机制

JVM中提供了三层的ClassLoader:

BootstrapClassLoader:主要负责加载核心的类库(rt.jar 等)。

ExtensionClassLoader:主要负责加载jre/lib/ext目录下的一些扩展的jar。

ApplicationClassLoader:主要负责加载应用程序的

双亲委派图解:

当一个Hello.class这样的文件要被加载时。不考虑我们自定义类加载器,首先会在AppClassLoader中检查是否加载过,如果有那就无需再加载了。如果没有,那么会拿到父加载器,然后调用父加载器的loadClass方法。父类中同理也会先检查自己是否已经加载过,如果没有再往上。注意这个类似递归的过程,直到到达Bootstrap classLoader之前,都是在检查是否加载过,并不会选择自己去加载。直到BootstrapClassLoader,已经没有父加载器了,这时候开始考虑自己是否能加载了,如果自己无法加载,会下沉到子加载器去加载,一直到最底层,如果没有任何加载器能加载,就会抛出ClassNotFoundException

可以通过实现classLoader打破双亲委派

为什么要设计这种机制

1、防止类核心被篡改,如果有人想替换系统级别的类:String.java。篡改它的实现,在这种机制下这些系统的类已经被Bootstrap classLoader加载过了(为什么?因为当一个类需要加载的时候,最先去尝试加载的就是BootstrapClassLoader),所以其他类加载器并没有机会再去加载,从一定程度上防止了危险代码的植入
2、避免类的重复加载

类加载

Java 类加载(Class Loading)指的是将类的字节码文件加载到 Java 虚拟机中,并转换成 Java 类模板对象(Class Object)的过程。在 Java 中,类加载器负责加载类,并将类加载到 Java 虚拟机内存中,使得 Java 程序可以运行。

类加载过程

当程序主动使用某个类时,如果该类还未被加载到内存中,则系统会通过如下三个步骤来对该类进行初始化。

  1. 加载(Loading):将字节码文件读入内存,并生成对应的 Class 对象,这个过程由类加载器完成。

  2. 连接(Linking):

    • 验证(Verification):确保字节码符合 Java 虚拟机规范,并且没有安全漏洞。
    • 准备(Preparation):为类的静态变量分配存储空间,并设置默认初始值。
    • 解析(Resolution):将类中的符号引用转换成直接引用,即将常量池中的符号引用转换成内存地址。
  3. 初始化(Initialization):为类的静态变量赋值,并执行静态代码块。

标签:Java,--,虚拟机,JVM,java,机制,加载
From: https://www.cnblogs.com/hwjShl/p/16541277.html

相关文章

  • opencv-python 4.12. 模板匹配
    理论模板匹配是一种在较大图像中搜索和查找模板图像位置的方法。为此,OpenCV附带了一个函数cv.matchTemplate()。它只是在输入图像上滑动模板图像(如在2D卷积中),并比较模板图像下的输入图像的模板和补丁。在OpenCV中实现了几种比较方法。它返回一个灰度图像,其中每个像素表示该像素的......
  • NuGet Response status code does not indicate success: 401 (Unauthorized).
    Retrying'FindPackagesByIdAsyncCore'forsource'https://nexus-cn/repository/nuget-group/FindPackagesById()?id='Moq'&semVerLevel=2.0.0'.Anerroroccurredwhilesendingtherequest.Therequestwasaborted:Therequest......
  • 当我想要使用cv2的import时,我需要这么做
    不必通过pycharm导入它我们想要使用importcv2时,我们需要在库里面导入这两个包即可:numpy和opencv-python这样就可以在python程序里面用importcv2啦!......
  • 两两交换节点位置:递归法、迭代法和数组转换法
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge"><metaname="viewport"content="width=......
  • 什么是gRPC?
    1.gRPC是什么,有哪些优点?gRPC是一种高性能、开源的远程过程调用(RPC)框架,它可以使不同平台和语言之间的服务相互通信。它的优点包括:高效性、跨平台、异步流处理、支持多种语言、安全、易于使用和开源。2.gRPC和REST的区别是什么?REST是基于HTTP协议的一种风格,而gRPC是一个独立于协......
  • 分布式技术剖析
    随着企业数字化进程的进一步深入,企业为了解决大数据的“4个V”问题,往往需要构建多个不同技术栈的大数据平台,其中不乏会使用到分布式相关的存储、计算、资源管理技术。分布式系统的出现解决了单机系统无法解决的成本、效率和高可用问题。那么什么是分布式技术?如何发展至今?主要包括......
  • 游记 | 20230402 · 牛首山踏春 · 南京眼夜景
    目录0周六晚·准备1周日白天·牛首山1.1出发·随流·抄近路1.2游览佛顶宫1.3河堤·湖岸·桃花溪2周日下午·新发现(河西天街店)·蘇小柳(河西分院)3周日晚上·南京眼·保利大剧院总结0周六晚·准备去年秋天,我们三个去了栖霞山;今年春天,打算去牛首山逛......
  • vue3中路由错误自动跳转404页面 路由表写法
    定义路由表import{createRouter,createWebHashHistory}from"vue-router";constroutes=[ { path:"/", name:"home", component:Home, },//... { path:"/404", name:"404", component:()=&......
  • 函数-字符串函数
    函数:是指一段可以直接被另一段程序调用的程序或代码  代码:selectlpad('01',5,'-');/*lpad:字符串左填充---01*/selectrpad('01',5,'-');/*rpad:字符串右填充01---*/selecttrim('hellomysql');/*trim:去除头部和尾部的空格*/selectsubstring('he......
  • MySQL重复数据
    插入的数据中A,B,E存在重复数据,C没有重复记录123456789101112131415161718192021CREATETABLE`tab`(  `id`int(11)NOTNULLAUTO_INCREMENT,  `name`varchar(20)DEFAULTNULL,  PRIMARYKEY(`id`))ENGINE=InnoDBAUTO_INCREME......