类加载机制深度解析

多个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)

大家都在看

  • spring自动注入是单例还是多例?单例如何注入多例?

    单例多例需要搞明白这些问题: 1. 什么是单例多例; 2. 如何产生单例多例; 3. 为什么要用单例多例 4. 什么时候用单例,什么时候用多例; 1. 什么是单例、多例: 单例模式…

    Java 2023年5月30日
    091
  • volatile 关键字的 用法

    volatile关键字 什么是可见性? 可见性是指线程A改变变量的值后,线程B可以马上看到更改后变量的值 volatile的作用 关键字volatile提示线程每次从共享内存中读取…

    Java 2023年6月5日
    0106
  • Java基础—二进制与位运算符之间的关系

    我们知道,计算机中的数据信息都是以二进制0、1形式存在的,具体来说是以该数据的补码形式。在位运算符中有:>>,< package com.basic.day02;…

    Java 2023年6月7日
    079
  • vue+element-ui后台管理系统模板

    vue+element-ui后台管理系统模板 前端:基于vue2.0+或3.0+加上element-ui组件框架 后端:springboot+mybatis-plus写接口 通过A…

    Java 2023年6月15日
    061
  • Buuctf-Web-[ACTF2020 新生赛]Include

    前言 刷题网址:https://buuoj.cn/challenges#[ACTF2020 新生赛]Include 首先打开网页,提示 tips点击他,根据题目提示很难不想到是文件…

    Java 2023年6月13日
    0117
  • 【年度钻石】Linux云计算+运维笔记(2)《博学谷-黑马》

    防火墙分类 【年度钻石】Linux云计算+运维笔记(2)《博学谷-黑马》 逻辑上划分,防火墙可以大体分为主机防火墙和网络防火墙主机防火墙:针对于单个主机进行防护网络防火墙:针对网络…

    Java 2023年6月7日
    086
  • nginx 学习,详细总结

    一 、nginx介绍 1.简介 Nginx 是高性能的 HTTP 和反向代理的web服务器,处理高并发能力是十分强大的,能经受高负 载的考验,有报告表明能支持高达 50,000 个…

    Java 2023年6月8日
    092
  • 必知必会之Lambda表达式

    Java是一门强大的面向对象的语言,除了 8种基本的数据类型,其他一切皆为对象。因此,在 Java中定义函数或方法都离不开对象,也就意味着很难直接将方法或函数像参数一样传递,而 J…

    Java 2023年6月6日
    093
  • macOs 安装了最新版的JDK怎么JDK 1.6

    因公司项目使用多个版本的JDK编译,MacOS在安装了高版本的JDK后还需要再安装低版本的JDK ,此时安装低版本的JDK 系统提示已经安装了更高版本 解决办法: 1.挂载安装文件…

    Java 2023年5月30日
    079
  • 61.小尖尖

    dsfsf posted @2022-09-28 08:35 随遇而安== 阅读(6 ) 评论() 编辑 Original: https://www.cnblogs.com/55z…

    Java 2023年6月7日
    0109
  • java.lang.NoSuchMethodError: javax.servlet.ServletContext.getContextPath()Ljava/lang/String;

    问题描述: 在idea 中启动项目代码 出现以下错误: java.lang.NoSuchMethodError: javax.servlet.ServletContext.getC…

    Java 2023年5月29日
    097
  • 干了3年程序员,我开窍了

    “当时每酣醉,不觉行路难”。 每每有人问我: 程序员工作三年,要大致学习到什么程度才算合格? 这时候,我感觉很难给出一个绝对正确的回答。 我能做的就是,如实…

    Java 2023年6月7日
    092
  • RabbitMQ—–死信队列

    1.什么是TTL? a. time to live 消息存活时间 b. 如果消息在存活时间内未被消费,则会被清除 c. RabbitMQ支持两种ttl设置 -单独消息进行配置ttl…

    Java 2023年5月30日
    096
  • linux下启动MongoDB权限不够

    bash: ./mongod: 权限不够 解决办法: 在MongoDB安装目录下: chmod -R 740 bin Original: https://www.cnblogs.c…

    Java 2023年6月15日
    093
  • Spring Boot:使用Memcached缓存

    综合概述 Memcached是一个自由开源的,高性能,分布式内存对象缓存系统。Memcached基于内存的key-value存储,用来存储小块的任意数据,这些数据可以是数据库调用、…

    Java 2023年5月30日
    093
  • 动态规划—摘花生

    Hello Kitty想摘点花生送给她喜欢的米老鼠。 她来到一片有网格状道路的矩形花生地(如下图),从西北角进去,东南角出来。 地里每个道路的交叉点上都有种着一株花生苗,上面有若干…

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