类加载机制深度解析

多个java文件经过编译打包生成可运行jar包,最终由java命令运行某个主类的main启动程序,这里需要先通过类加载器把主类加载到JVM

主类在运行过程中如果使用到其他类,会逐步加载这些类。

注意:jar包里的类不是一次性全部加载的,是使用到时才加载,不过类似于java.lang.Object这种支持JVM运行的类会在启动时便被加载。

类加载过程

加载>>验证>>准备>>解析>>初始化>>使用>>卸载

二、类加载器和双亲委派机制

类的加载主要通过类加载器来实现,java中的类加载器如下:

类加载器示例:

双亲委派机制的逻辑大致如下:

1.首先加载指定名称的类是否已被加载过,如果加载过就不需要重复加载,直接返回。

2.如果此类没有被加载,那么判断是否有父类加载器,如果有,则委派给父加载器加载,如果没有则直接委派给启动类加载器加载。

3.如果父加载器及bootstrapClassLoader均没有找到目标类则有当前类加载器的findClass完成加载。

总结:加载器加载时将加载动作逐级向上委托直到最高级的启动类加载器,再从最高级向下逐级进行目标类加载,如果在某一级加载到了目标类则不再向下继续。

设计双亲委派机制的目的:

在自定义类加载器示例:

自定义类加载器主要是重写findclass()方法:

打破双亲委派机制

如果要打破双亲委派机制只需要重写loadClass()这个方法

测试类:

Original: https://www.cnblogs.com/qishanmozi/p/c332d9e7c0c72831e4a4b0ae9f19e8f4.html
Author: 祁山墨子
Title: 类加载机制深度解析

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/608663/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • java 调用命令行工具类

    runCmdOnDir是指定目录执行的函数 package cn.com.ruijie.rgonc.grpc.impl.utils; import java.io.*; publi…

    Java 2023年5月29日
    087
  • 02 MyBatis & Druid

    MyBatis MyBatis 是灵活的 SQL 映射, 不想 Hibrnate 是纯的 ORM, 个人还是比较写 SQL 语句, 不喜欢纯的 ORM. 首先引入 Maven 依赖…

    Java 2023年5月30日
    066
  • Centos部署Loki日志聚合系统

    关于一些日志聚合由来及原理科普见我的另外一篇 《编程入门之日志聚合系统》 https://www.cnblogs.com/uncleguo/p/15948763.html Loki…

    Java 2023年6月15日
    076
  • Windows环境MySql差异备份

    前言 备份上一次的完全备份后发生变化的所有文件。 差异备份是指在一次全备份后到进行差异备份的这段时间内 对那些增加或者修改文件的备份。在进行恢复时,我们只需对第一次全量备份和最后一…

    Java 2023年6月8日
    070
  • 通用查询解决方案

    package cn.com.fmsh.nfcos.sapo.biz; import java.util.*; import java.util.regex.*; import j…

    Java 2023年6月9日
    077
  • win7安装MongoDB报错的问题(基本所有该踩的坑都踩了)

    昨天突发奇想想来玩一玩,然后安装了一下午才成功,基本所有该踩的坑都踩了,但当时没截图,现在靠着记忆写一下。 官网链接:https://www.mongodb.com/try/dow…

    Java 2023年6月5日
    098
  • SpringBoot版不需要配置文件注解获取当前登录用户

    本文讯(2019年3月30日 飞快的蜗牛博客) 我是一个懒人,很久不写博客,想起来看到也不一定会写,只有心血来潮的时候写写,”钱塘江上潮信来,今日方知我是我&#8221…

    Java 2023年6月16日
    094
  • Mybatis学习笔记

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Java 2023年6月7日
    0115
  • 从服务间的一次调用分析整个springcloud的调用过程(二)

    先看示例代码 @RestController @RequestMapping("/students") public class StudentControll…

    Java 2023年6月7日
    072
  • 【LEETCODE】71、验证二叉树的前序序列化

    简单粗暴,代码有待优化,不过自己独立完成,没有参考任何材料,还是比较满意的 package y2019.Algorithm.stack.medium; import java.ut…

    Java 2023年6月5日
    099
  • 装了这几个IDEA插件,基本上一站式开发了!

    前言 前几天有社区小伙伴私聊我,问我都用哪些IDEA插件,我的IDEA的主题看起来不错。 作为一个开源作者,每周要code大量的代码,提升日常工作效率是我一直追求的,在众多的IDE…

    Java 2023年6月8日
    078
  • Spring系列22:Spring AOP 概念与快速入门篇

    本文内容 Spring AOP含义和目标 AOP相关概念 声明式AOP快速入门 编程式创建代理对象 Spring AOP含义和目标 OOP: Object-oriented Pro…

    Java 2023年6月5日
    082
  • JAVA的变量与常量

    实践是唯一的真理。 变量 变量的定义 变量就是可以变化的量。 JAVA变量是程序中最基础的程序单元,其要素包括变量名,变量类型及作用域。 写程序要注意程序的可读性 如图所示,可以一…

    Java 2023年6月9日
    078
  • AdoptOpenJDK(JAVA环境)安装

    检测是否存在JDK 接下来可以将 java 开头的安装包均卸载即可 下载JDK 解压完之后, /opt/module/ ⽬录中会出现⼀个 jdk8u252-b09的⽬录 配置JDK…

    Java 2023年5月29日
    072
  • Java基础–线程创建方式

    线程的创建主要有两种形式,通过 继承Thread或者 实现Runnable&#x63…

    Java 2023年6月5日
    057
  • rocketmq常见问题

    「Producer提示”No Topic Route Info”,如何诊断?」 当您尝试将消息发送到一个路由信息对生产者不可用的主题时,就会发生这种情况。 …

    Java 2023年6月5日
    085
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球