尚硅谷2020最新版宋红康JVM教程-中篇-第4章:再谈类的加载器-01-概述

JVM从入门到精通(尚硅谷宋红康) 01-JVM内存与垃圾回收篇概述 对 Java 程序员来说,Java 虚拟机(JVM )可以说是既熟悉又神秘,很少有 Java 程序员能够抑制自己探究它的冲动。可惜透彻讲解 JVM 的书籍(尤其是国内出版的)简直少之又少,这里就更不要说能系统讲解 JVM 的视频教程了。尚硅谷的这套 JVM 从入门到精通,绝对可谓是研究 JVM 的程序员及广大 JVM 爱好者的福音。 课程内容分为四个篇章 内存与垃圾回收篇 字节码与类的加载篇 性能监控与调优篇 大厂面试篇 本套视频使用到的软件 # JDK1.8 目前企业 阅读详情

引言

  • 类加载器是JVM执行类加载机制的前提。
  • ClassLoader的作用:ClassLoader是Java的核心组件,所有的Class都是由ClassLoader进行加载的,ClassLoader负责通过各种方式将Class信息的二进制数据流读入JVM内部,转换为一个与目标类对应的java.lang.Class对象实例。然后交给Java虚拟机进行链接、初始化等操作。因此,ClassLoader在整个装载阶段,只能影响到类的加载,而无法通过ClassLoader去改变类的链接和初始化行为。至于它是否可以运行,则由Execution Engine决定。

在这里插入图片描述

  • 类加载器最早出现在Java1.0版本中,那个时候只是单纯地为了满足Java Applet应用而被研发出来。但如今类加载器却在OSGi、字节码加解密领域大放异彩。这主要归功于Java虚拟机的设计者们当初在设计类加载器的时候,并没有考虑将它绑定在JVM内部,这样做的好处就是能够更加灵活和动态地执行类加载操作。

大厂面试题

蚂蚁金服:
深入分析ClassLoader,双亲委派机制
类加载器的双亲委派模型是什么?一面:双亲委派机制及使用原因

百度:
都有哪些类加载器,这些类加载器都加载哪些文件?
手写一个类加载器Demo
Class的forName(“java.lang.String”)和Class的getClassLoader()的Loadclass(“java.lang.String”)有什么区别?

腾讯:
什么是双亲委派模型?
类加载器有哪些?

小米:
双亲委派模型介绍一下

滴滴:
简单说说你了解的类加载器一面:讲一下双亲委派模型,以及其优点

字节跳动:
什么是类加载器,类加载器有哪些?

京东:
类加载器的双亲委派模型是什么?
双亲委派机制可以打破吗?为什么

类加载的分类

  • 类的加载分类:显式加载 vs隐式加载

  • class文件的显式加载与隐式加载的方式是指JVM加载class文件到内存的方式。

    • 显式加载指的是在代码中通过调用ClassLoader加载class对象,如直接使用Class.forName(name)或this.getClass().getClassLoader().loadClass()加载class对象。
    • 隐式加载则是不直接在代码中调用ClassLoader的方法加载class对象,而是通过虚拟机自动加载到内存中,如在加载某个类的class文件时,该类的class文件中引用了另外一个类的对象,此时额外引用的类将通过JVM自动加载到内存中。
  • 在日常开发以上两种方式一般会混合使用。

代码举列

User user=new User();//隐式加载
Class clazz=Class.forName("com.atguigu.java.User");//显式加载并初始化
ClassLoader.getSystemClassLoader().loadClass("T1.Parent"); //显式加载,但不初始化

类加载器的必要性

一般情况下,Java开发人员并不需要在程序中显式地使用类加载器,但是了解类加载器的加载机制却显得至关重要。从以下几个方面说:

  • 避免在开发中遇到java.lang.ClassNotFoundException异常或java.lang.NoClassDefFoundError异常时,手足无措。只有了解类加载器的 加载机制才能够在出现异常的时候快速地根据错误异常日志定位问题和解决问题
  • 需要支持类的动态加载或需要对编译后的字节码文件进行加解密操作时,就需要与类加载器打交道了。
  • 开发人员可以在程序中编写自定义类加载器来重新定义类的加载规则,以便实现一些自定义的处理逻辑。

命名空间

何为类的唯一性?

对于任意一个类,都需要由加载它的类加载器和这个类本身一同确认其在Java虚拟机中的唯一性。每一个类加载器,都拥有一个独立的类名称空间:比较两个类是否相等,只有在这两个类是由同一个类加载器加载的前提下才有意义。否则,即使这两个类源自同一个Class文件,被同一个虚拟机加载,只要加载他们的类加载器不同,那这两个类就必定不相等。

命名空间

  • 每个类加载器都有自己的命名空间,命名空间由该加载器及所有的父加载器所加载的类组成
  • 在同一命名空间中,不会出现类的完整名字(包括类的包名)相同的两个类
  • 在不同的命名空间中,有可能会出现类的完整名字(包括类的包名)相同的两个类

在大型应用中,我们往往借助这一特性,来运行同一个类的不同版本。

代码举例

package T1;

import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

public class UserClassLoader extends ClassLoader {
    private String rootDir;

    public UserClassLoader(String rootDir) {
        this.rootDir = rootDir;
    }

    // 编写findclass方法的逻辑
    protected Class<?> findClass(String name) throws ClassNotFoundException {
        //获取类的cLass文件字节数组
        byte[] classData = getClassData(name);
        if (classData == null) {
            throw new ClassNotFoundException();
        } else {
            //直接生成cLass对象
            return defineClass(name, classData, 0, classData.length);
        }
    }


    // 编写获cLass文件并转换为字节码流的逻辑
    private byte[] getClassData(String className) {
        //读取类文件的字节
        String path = classNameToPath(className);
        try {
            InputStream ins = new FileInputStream(path);
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            byte[] buffer = new byte[1024];
            int len = 0;

            //读取类文件的字节码
            while ((len = ins.read(buffer)) != -1) {
                baos.write(buffer, 0, len);
            }
            return baos.toByteArray();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;

    }

    // 类文件的完全路径
    private String classNameToPath(String className) {
        return rootDir + "\\" + className.replace('.', '\\') + ".class";
    }

    public static void main(String[] args) throws ClassNotFoundException {
        String rootDir = "F:\\java\\apache-maven-3.6.3\\jvm\\src\\main\\java";

        UserClassLoader userClassLoader1 = new UserClassLoader(rootDir);
        Class class1 = userClassLoader1.findClass("T1.User");
        UserClassLoader userClassLoader2 = new UserClassLoader(rootDir);
        Class class2 = userClassLoader2.findClass("T1.User");


        System.out.println(class1 == class2); // false
        System.out.println("class1:" + class1.getClassLoader()); // class1:T1.UserClassLoader@1b6d3586
        System.out.println("class2:" + class2.getClassLoader()); // class2:T1.UserClassLoader@74a14482


        // 应用类加载器
        Class class3 = ClassLoader.getSystemClassLoader().loadClass("T1.User");
        System.out.println(class3.getClassLoader()); // sun.misc.Launcher$AppClassLoader@18b4aac2

        // 删除target.classes.T1.User.class文件时,报错Exception in thread "main" java.lang.ClassNotFoundException: T1.User
        // 原因应用类加载器使用默认生成的class文件
        // 解决办法:Build->Recompile 指定java文件

    }

}

类加载机制的基本特征

  • 双亲委派模型。但不是所有类加载都遵守这个模型,有的时候,启动类加载器所加载的类型,是可能要加载用户代码的,比如JDK内部的ServiceProvider/ServiceLoader机制,用户可以在标准API框架上,提供自己的实现,JDK也需要提供些默认的参考实现。例如,Java中JNDI、JDBC、文件系统、Cipher等很多方面,都是利用的这种机制,这种情况就不会用双亲委派模型去加载,而是利用所谓的上下文加载器。
  • 可见性,子类加载器可以访问父加载器加载的类型,但是反过来是不允许的。不然,因为缺少必要的隔离,我们就没有办法利用类加载器去实现容器的逻辑。
  • 单一性,由于父加载器的类型对于子加载器是可见的,所以父加载器中加载过的类型,就不会在子加载器中重复加载。但是注意,类加载器“邻居”间,同一类型仍然可以被加载多次,因为互相并不可见。
尚硅谷——Java类加载器 虚拟机设计团队把类加载阶段中的"通过一个类的全限定名来获取描述此类的二进制字节流"这个动作放到Java虚拟机外部去实现, 以便让应用程序自己决定如何去获取所需要的类. 实现这个动作的代码模块称为"类加载器". 立即下载

相关推荐

智能网联汽车电子电气架构(下)

从资产的表现形式, 可以分为数据、 软件、 硬件、 服务等, 而从需要保护的业务过程和活动、 所关注信息的角度, 资产类型可包括基于 ECU 的控制功能、 与特定车辆相关的信息、 车辆状态信息、 用户信息、 配置信息、 特定的软件、 内容等。面向新一代 EEA 的安全需求, 基于芯片提供的 OTP, 或SHE\HSM 的安全存储能力, 实现系统关键数据(身份、 密钥等关键信息) 的安全存储, 保证系统的关键数据不被盗取、 破坏、 改写。结合攻击者的动机与识别出的系统用例, 分析对汽车电子系统可能的攻击。

m0_58838529的博客 1470

JVM笔记(B站宋红康课件)

JVM笔记(B站宋红康课件)

记录开发中常见的问题以及技术等 1019

GB 44497-2024《智能网联汽车 自动驾驶数据记录系统》标准解读

GB 44497-2024《智能网联汽车 自动驾驶数据记录系统》针对智能网联汽车的自动驾驶数据记录系统进行了全面规范。标准要求我们记录车辆在自动驾驶模式下的所有关键操作数据,如:1. 车辆状态数据,如速度、加速度、转向角度、制动状态等;2. 环境感知数据,如周围物体的位置、速度、类型等;3. 驾驶决策数据,如路径规划、避障决策、紧急制动指令等;4. 系统状态数据,如软件版本、硬件状态、系统警告信息等。在数据存储方面,标准强调了数据的安全性和可靠性。

daopuyun的博客 2666

尚硅谷2020最新版宋红康JVM教程-中篇-第1章Class文件结构-3-Class文件结构

魔数:Class文件的标志 官方文档位置: https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html Class文件版本号

admin741admin的博客 1063

别再让OCV拖慢你的芯片!手把手教你用set_timing_derate优化STA时序(附CPPR实战)

本文深入探讨了芯片设计中OCV(On-Chip Variation)对时序分析的影响,并提供了使用`set_timing_derate`优化STA时序的实战指南。通过分阶段derate设置和CPPR技术,有效减少时序违例,提升芯片性能。文章结合TSMC 7nm工艺案例,详细解析了OCV建模与优化策略,助力工程师实现时序收敛。

weixin_42525005的博客 303

软件测试面试题之易错题

(1)白盒测试:又称功能功能 测试、数据驱动测试和行为测试,是一种从用户观点出发的测试,被测程序为黑盒子, 通过测试来检测每个功能是否能够正常使用。(2)黑盒测试:又称结构测试和逻辑驱动 测试,是知道产品内部工作过程,通过测试来检测产品内部动作是否按照规格说明书 的规定去正常运行。(1)、测试需求分析;(2)动态白盒测试:需要对各个模块功能、模块间的接口、局部数据结构、主要执行路径、 错误处理等方面的测试。(2) 集成测试所测试的对象是模块间的接口,其目的是在找出在模块接口上面,包括整体体系结构上的问题;

m0_37449634的博客 678

宋红康版JVM笔记 ppt

JVM上篇:内存与垃圾回收篇: 链接:https://pan.baidu.com/s/1TcHFE6YEk32Td_zXpZRSrg 提取码:7jc7 JVM中篇:字节码与类的加载篇: 链接:https://pan.baidu.com/s/1k6TmnpRqXro5DjCMBz0Qgg 提取码:sdxw JVM下篇:性能监控与调优篇: 链接:https://pan.baidu.com/s/1MZoq_tsNCg2Cx_xIasSJng 提取码:qrbt ...

weixin_42403127的博客 1805

固定效应模型-以stata为工具

固定效应模型(Fixed Effects Model)是一种面板数据分析方法,通过引入个体固定效应来控制个体间的异质性,并更准确地估计解释变量对因变量的影响。它在许多经济、社会科学和健康研究中被广泛应用。

侯小啾技术博客 2837

尚硅谷2020最新版宋红康JVM教程学习笔记 一 类加载子系统

JAVA语言是跨平台的语言,JVM虚拟机是跨语言的平台。JVM虚拟机并不关心字节码文件是由什么语言生成的。只有不同的语言通过编译器生成符合JVM虚拟机规范的字节码文件,JVM就能够运行。JAVA就是通过编译生成字节码文件,然后再在JVM上运行。因此JAVA语言可以一次编译到处运行。 虚拟机 虚拟机是一台虚拟计算机,是用来执行虚拟计算机指令的软件。虚拟机可以分为系统虚拟机和程序虚拟机。 如VMware就是系统虚拟机,他是对物理计算机的仿真。 Java虚拟机是程序虚拟机,他专门为执行单个计算机程序而设计,在ja

qq_30033509的博客 1293

【WSN定位】基于AOA算法实现目标无源定位附matlab代码

1 简介 2 部分代码 clear all; close all; clc;​stations = [0 0 0;20 0 0]; %基站位置​X = -100:100; %生成目标位置Y = X.*sin(X);Z = X+Y;N = length(X);Locations = zeros(N,3);angs = zeros(N,4);for i = 1:N angs(i,:) = Angs(stations*1e3,[X(i),Y(i),Z(i)]*1e3);end​for

qq_59747472的博客 2308

Qt 5.14安装(配置MSVC 2017)

本文主要介绍Qt MSVC的安装,VS2017.

ifeng12358的博客 3709

尚硅谷2020最新版宋红康JVM教程-目录

第一篇:内存与垃圾回收篇 最新版宋红康JVM教程-1-JVM简介 尚硅谷2020最新版宋红康JVM教程-2-类加载子系统 尚硅谷2020最新版宋红康JVM教程-3-运行时数据区概述及线程 尚硅谷2020最新版宋红康JVM教程-4-程序计数器 尚硅谷2020最新版宋红康JVM教程-5-虚拟机栈 尚硅谷2020最新版宋红康JVM教程-6-本地方法接口 尚硅谷2020最新版宋红康JVM教程-7-本地方法栈 尚硅谷2020最新版宋红康JVM教程-8-堆 尚硅谷2020

admin741admin的博客 2689

热力学仿真软件:Fluent_(13).燃烧与化学反应仿真

燃烧模型在热力学仿真软件中扮演着至关重要的角色。Fluent 提供了多种燃烧模型,包括层流预混燃烧模型、湍流预混燃烧模型、非预混燃烧模型、部分预混燃烧模型等。这些模型可以帮助用户模拟不同的燃烧过程,从而更好地理解燃烧现象和优化燃烧系统设计。

kkchenjj的博客 1252

尚硅谷 宋红康 JVM教程_02_字节码与类的加载篇

目录 尚硅谷 宋红康 JVM教程 学习笔记 https://www.bilibili.com/video/BV1PJ411n7xZ ppt地址: https://download.youkuaiyun.com/download/wei198621/14040543 JVM参数列表: https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html P204-JVM中篇内容概述 11:51 P205-字节码文件的跨平台性 13:12 P2

狗剩的专栏 1437

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

尚硅谷 宋红康 JVM教程_01_内存与垃圾回收篇——01

目录 尚硅谷 宋红康 JVM教程 学习笔记 https://www.bilibili.com/video/BV1PJ411n7xZ P01-JVM内存与垃圾回收篇概述 09:34 P02-如何看待Java上层技术与JVM 20:17 P03-为什么要学习JVM 05:14 P04-面向人群和课程特点 10:15 P05-官方规范下载与参考书目 08:30 P06-跨平台的语言Java和跨语言的平台JVM 15:22 P07-字节码与多语言混合编程 06:25 P08

狗剩的专栏 2498

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

尚硅谷阳哥JVM

JavaVirtualMachine,Java虚拟机**位置:**JVM是运行在操作 系统之上的,它与硬件没有直接的交互。为什么要在程序和操作系统中间添加一个JVM?Java 是一门抽象程度特别高的语言,提供了自动内存管理等一系列的特性。这些特性直接在操作系统上实现是不太可能的,所以就需要 JVM 进行一番转换。有了 JVM 这个抽象层之后,Java 就可以实现跨平台了。JVM 只需要保证能够正确执行 .class 文件,就可以运行在诸如 Linux、Windows、MacOS 等平台上了。

Fqxiny的博客 1395

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

尚硅谷JVM全套教程

不从恶人的计谋,不站罪人的道路,不坐亵慢人的座位,惟喜爱耶和华的律法,昼夜思想,这人便为有福!他要像一棵树栽在溪水旁,按时候结果子,叶子也不枯干。凡他所做的尽都顺利。

七叔的博客 1万+

为什么jvm要分为堆、方法区等?原理是什么?_JVM从入门到精通视频教程首发!连载更新模式开启!...

对于Java程序员来说,Java虚拟机(JVM)既熟悉又神秘,少有Java程序员能够抑制自己探究JVM的冲动。可惜透彻讲解JVM的书籍少之又少,更不要说系统讲解JVM的视频教程了。JVM学习之难,难于抢春运火车票!你,曾经被JVM伤害过吗?线上系统突然卡死,无法访问甚至直接OOM!想解决线上JVM GC问题,却无从下手……新项目上线,对参数设置一脸懵逼,直接默认吧,之后JJ了……面试前背...

weixin_39614877的博客 111

JVM尚硅谷版 jvm上篇:内存与垃圾回收篇(前九章)

JVM尚硅谷版01 jvm上篇:内存与垃圾回收篇1.jvm与Java体系结构1.java层级2.jvm的位置3.跨平台4.跨语言的平台5.字节码6.虚拟机与Java虚拟机7.jvm整体结构8.java代码执行流程9.jvm架构模型10.jvm生命周期11.jvm发展历程2.类加载子系统1.内存结构概述2.类加载器与类的加载过程3.类加载器分类4.classLoader使用说明5.双亲委派机制6.其他3.运行时数据区概述与线程1.运行是数据区内部结构2.线程4.程序寄存器(PC寄存器)1.pc介绍2.举例说明

licux的博客 531

JVM 周阳 尚硅谷19-06

这里写目录标题一 JVM介绍二 类加载器1 什么是类加载器2 类加载器的种类3 双亲委派机制4 沙箱安全机制三 执行引擎四 Native Interface 本地方法接口五 PC寄存器(程序计数器) Program Countter Register六 方法区 Method Area七 Stack栈内存 栈管运行 堆管存储八 堆 栈 方法区的交互关系九 Heap 堆Heap堆 结构简介new对象的流程 一 JVM介绍 灰色: 代表线程私有 内存占用较少 橙色: 线程共享 存在垃圾回收 二 类加

weixin_43691773的博客 639

【JVM】面试题-01

1.尚硅谷Java开发常见面试题详解。

Blue_Pepsi_Cola的博客 562

01 JVM与Java体系--B站尚硅谷JVM课程学习

1 前言 Java自动动态管理内存,自动垃圾回收 2 面向人群及参考书目 Java虚拟机规范: 《深入理解Java虚拟机》周志明 3 Java及JVM简介 Java:跨平台语言 JVM:跨语言的平台 Java内置的虚拟机是HotSpot 任何能在JVM平台上执行的字节码格式是相同的,统称为JVM字节码 4 Java发展的重大事件 5 虚拟机与Java虚拟机 6 JVM整体结构 7 Java代码执行流程 8 JVM的架构模型 9 JVM生命周期 10 JVM的发展历程 ...

x18845040365的博客 239

JVM学习笔记01-JVM与其结构结构

JVM的学习笔记

misadfa的博客 549

JVM入门之类加载器

JVM入门之类加载器 JVM架构体系 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JtKNBVLX-1611303275103)(https://note.youdao.com/yws/api/personal/file/F88865AE2E12481A9226A102289EDEF9?method=download&shareKey=8f3e2a79c31985c4a432e9aa401f07a7)] 类加载器 负责加载class文件,class文件在文件开头有特

qq_41884972的博客 199

你真的懂JVM嘛之第一篇JVM概述

学习一个技术最先开始了解的应该是它的目的,它会给我们带来什么?作为Java选手,你是否遇到以下问题?掌握JVM可以进行。(当然还可以很好的应付面试)

ice的博客 198

<JVM从入门到精通>导航

JVM上篇:内存与垃圾回收篇 JVM中篇:字节码与类的加载篇 JVM下篇:性能监控与调优篇

VectorX's Blog 1840
上一篇: 尚硅谷2020最新版宋红康JVM教程-中篇-第3章类的加载过程(类的生命周期)详解-5和6-类的使用和卸载
下一篇: 尚硅谷2020最新版宋红康JVM教程-中篇-第4章:再谈类的加载器-02和03-类的加载器分类
zgcadmin
博客等级 码龄9年 174粉丝 109原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值