Java常用类:ClassLoader

Android解析ClassLoader(一)Java中的ClassLoader 热修复和插件化是目前比较热门的技术,要想更好的掌握它们需要了解ClassLoader,因此也就有了本系列的产生,这一篇我们先来学习Java中的ClassLoader。 阅读详情

作为一个稀有的Java妹子,所写的所有博客都只是当作自己的笔记,留下证据自己之前是有用心学习的~哈哈哈哈(如果有不对的地方,也请大家指出,不要悄悄咪咪的不告诉我)

ClassLoader

1.ClassLoader的作用

Class Loader是用来把.class字节码文件加载到jvm内存中的,也就是把.class文件加载为Class对象。

2.ClassLoader的分类

Java内置了三个重要的ClassLoader,分别是 BootstrapClassLoader、ExtensionClassLoader 和 AppClassLoader。

BootstrapClassLoader 负责加载 JVM 运行时核心类,这些类位于 JAVA_HOME/lib/rt.jar 文件中,我们常用内置库 java.xxx.* 都在里面,比如 java.util.、java.io.、java.nio.、java.lang. 等等。这个 ClassLoader 比较特殊,它是由 C 代码实现的,我们将它称之为「根加载器」。

ExtensionClassLoader 负责加载 JVM 扩展类,比如 swing 系列、内置的 js 引擎、xml 解析器 等等,这些库名通常以 javax 开头,它们的 jar 包位于 JAVA_HOME/lib/ext/*.jar 中,有很多 jar 包。

AppClassLoader 才是直接面向我们用户的加载器,它会加载 Classpath 环境变量里定义的路径中的 jar 包和目录。我们自己编写的代码以及使用的第三方 jar 包通常都是由它来加载的。

3.双亲委派模型

当类加载器接受到加载类的请求时,首先是查看当前类是否已经加载,未加载的话查找是否有父级类加载器,有的话把加载类的操作交给父类加载器来完成,最终加载操作会到BootstrapClassLoader,如果BootstrapClassLoader不能加载这类,则让ExtensionClassLoader加载,如果ExtensionClassLoader也不能加载,就让AppClassLoader加载。
这样加载的好处就是使得每个类只被加载一次,且重要的基础类,如String,如果用户自己定义一个String,加载后就会破坏程序,而双亲委派模型保证String只会被BootstrapClassLoader加载,自定义的String无法完成加载。
在这里插入图片描述

4.源码解析

public abstract class ClassLoader {
	//每个ClassLoader都有自己的父级ClassLoader
    private final ClassLoader parent;
    //加载类方法
    public Class<?> loadClass(String name) throws ClassNotFoundException {
        return loadClass(name, false);
    }
    protected Class<?> loadClass(String name, boolean resolve)
        throws ClassNotFoundException
    {
        synchronized (getClassLoadingLock(name)) {
            // 检查类是否已被加载
            Class<?> c = findLoadedClass(name);
            if (c == null) {
                long t0 = System.nanoTime();
                try {
                	//未被加载则查看父级加载器是否为null
                    if (parent != null) {
                    	//不为空则把加载操作给父级类加载
                        c = parent.loadClass(name, false);
                    } else {
                    	//为null说明此时已经是BootstrapClassLoader
                        c = findBootstrapClassOrNull(name);
                    }
                } catch (ClassNotFoundException e) {
                    // ClassNotFoundException thrown if class not found
                    // from the non-null parent class loader
                }
				//如果类为空,说明父级加载器不能加载此类,自己加载
                if (c == null) {
                    // If still not found, then invoke findClass in order
                    // to find the class.
                    long t1 = System.nanoTime();
                    c = findClass(name);

                    // this is the defining class loader; record the stats
                    sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);
                    sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);
                    sun.misc.PerfCounter.getFindClasses().increment();
                }
            }
            if (resolve) {
                resolveClass(c);
            }
            return c;
        }
    }

5.Class.forName()和ClassLoader.loadClass()的区别

这两者都是加载类的,把.class文件转换为Class对象加载到jvm内存中,区别在于Class.forName会加载并初始化类,而Class Loader.loadClass()只是加载类,等到有new操作或者其他初始化类的时候才会真正的初始化类,这里也说明了Java中的类加载是懒加载机制,并不是在启动时初始化所有的类,启动时只是加载所有的类。

Class.forName()也是会调用ClassLoader.loadClass(),本质上也是用过类加载器来完成加载类的操作。

//Class里有ClassLoader变量,记录该类的类加载器
private final ClassLoader classLoader;
public static Class<?> forName(String className)
                throws ClassNotFoundException {
        Class<?> caller = Reflection.getCallerClass();
        //true就代表初始化类,参数列表中也有ClassLoader
        return forName0(className, true, ClassLoader.getClassLoader(caller), caller);
    }

举例说明Class.forName()会初始化类:

public class ClassLoaderDemo {
    static {
        System.out.println("init ClassLoaderDemo");
    }
}

public class ClassLoaderDemoTest {

    @Test
    public void testClassLoaderDemo(){
        try {
            Class clazz = Class.forName("com.jdk_source_code.demo.util.ClassLoaderDemo");
            System.out.println("########以下是采用类加载类加载类########");
            ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
            systemClassLoader.loadClass("com.jdk_source_code.demo.util.ClassLoaderDemo");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }


    }
}

结果:
init ClassLoaderDemo
########以下是采用类加载类加载类########

可以看出,Class.forName()会初始化类,静态代码块也会执行,而ClassLoader.loadClass()不会初始化类,Spring的IOC是用的ClassLoader,而数据库驱动是用的Class.forName(“com.mysql.cj.jdbc.Driver”),因为JDBC规范中明确要求Driver(数据库驱动)类必须向DriverManager注册自己,而注册的代码是在静态方法块中。

public class Driver extends NonRegisteringDriver implements java.sql.Driver {  
    // Register ourselves with the DriverManager  
    static {  
        try {  
            java.sql.DriverManager.registerDriver(new Driver());  
        } catch (SQLException E) {  
            throw new RuntimeException("Can't register driver!");  
        }  
    }  
    public Driver() throws SQLException {  
        // Required for Class.forName().newInstance()  
    }  
}
Java中的ClassLoader 动态加载机制 前言: Android中的动态加载机制能更好的优化我们的应用,同时实现动态的更新,这就便于我们管理我们的应用,通过插件化来减轻我们的内存以及CPU消耗,在不发布新版本的情况下能更新某些模块。 当然这里要说的并不是android中的动态加载机制,而是java中的ClassLoader动态加载我们的class,虽然android是基于Dalvik,但是先了解java中JVM怎么来加载我们的clas 阅读详情

相关推荐

一看你就懂,超详细java中的ClassLoader详解

本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 ClassLoader翻译过来就是类加载器,普通的java开发者其实用到的不多,但对于某些框架开发者来说却非常常见。理解ClassLoader的加载机制,也有利于我们编写出更高效的代码。ClassLoader的具体作用就是将class文件加载到jvm虚拟机中去,程序就可以正确运行了。但是,jvm启动的时候,并不会一次性加载所有的...

frank 的专栏 34万+

简析ClassLoader

ClassLoader是什么?Java程序运行时,按需动态加载各类编译之后的.Class文件,以保证程序的正常运行。如果.Class文件缺失,则会抛出ClassNotFoundException.Java中的ClassLoaderJava默认提供了3个ClassLoader: 1. BootstrapClassLoader:启动类加载器。负责加载JAVA中的核心库。 2. ExtCl

Redvelvet的博客 209

2023电赛B题实战解析:基于立创天空星开发板的同轴线缆长度与负载测量系统

本文详细解析了2023年全国大学生电子设计竞赛B题的实战方案,重点介绍了基于立创EDA天空星开发板(STM32F103)的同轴线缆长度与负载测量系统。文章深入剖析了两种核心测量方案,并推荐了更稳定易实现的NE555测电容法,提供了从硬件选型、电路设计到软件编程、参数标定的完整“施工图”,实测精度可达厘米级和皮法级,为电赛复现与高精度测量学习提供了清晰指导。

weixin_36303305的博客 230

浅谈Android中的ClassLoader

1、Android中有哪几种ClassLoader?它们的作用和区别是什么?ClassLoader是个抽象类,其具体实现的子类有 BaseDexClassLoader 和SecureClassLoader 。SecureClassLoader 的子类是 URLClassLoader ,其只能用来加载 jar 文件,这在 Android 的 Dalvik/ART 上没法使用的。BaseDexClas...

cylzll的博客 886

【SPSS操作】Non-parametric ANCOVA (Quade‘s) in SPSS

在SPSS中执行Quade的非参数ANCOVA需要手动计算步骤,因为SPSS没有内置的菜单选项。以下是详细的操作指南。

weixin_43689393的博客 1277

电脑版微信多开,最详细教程没有之一

首先桌面任意的位置右键新建文本文档输入如下代码: TASKKILL /F/IM WECHAT.EXE start " " "D:\Program Files (x86)\Tencent\WeChat\WeChat.exe" start " " "D:\Program Files (x86)\Tencent\WeChat\WeChat.exe" ...

大超子 4389

JVM(二)、常见的类加载器

其实关于类加载器相关的,就不得不提到另外一个概念,也就是双亲委派;其实双亲委派是我们音译过来的叫法,严格意义上来说叫做 父类委派 更合适一些;按照个人理解(个人理解,如有错误,还请指正)通俗的解释下双亲委派的流程:在进行类加载的过程,首先其实就是会执行loadClass方法,一句话概括其实就是向上检查,向下委派;

wogaizabanwuwu的博客 1001

实战:如何用MIPI CSI-2高效传输RAW10图像数据(附带宽优化技巧)

本文深入探讨了MIPI CSI-2协议在RAW10图像数据传输中的高效应用,详细解析了4像素5字节打包机制及其带宽优化技巧。通过动态Lane分配、位深度自适应压缩和虚拟通道交错传输等实战方法,显著提升传输效率,适用于IoT摄像头开发等低功耗场景。

css33的专栏 731

类加载及双亲委派模型

逾越的博客 5945

HDR 成像技术学习(三)—— LOFIC

LOFIC(Lateral Overflow Integration Capacitor,横向溢出集合电容)介绍,从像素结构到工作时序。

沧海一升的博客 9729

外向交货单批次赋值的标准姿势:用 BAPI_OUTB_DELIVERY_CHANGE 把 LIPS-CHARG 改得稳、改得干净

摘要: 外向交货单批次赋值涉及严格的业务约束,包括批次管理状态、单据状态、拆分规则等,直接更新表 LIPS 不可取。推荐使用 BAPI_OUTB_DELIVERY_CHANGE 接口,通过标准业务逻辑实现批次修改。关键点包括:区分单批次分配与批次拆分场景,正确设置 ITEM_CONTROL 控制结构,并确保单位/数量数据完整。附可直接执行的ABAP代码示例,实现安全可靠的批次更新流程。 (字数:149字)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 394

详解JAVA ClassLoader

ClassLoader,翻译成中文就是“类加载器”。对于普通的 Java 开发者来说,可能接触得比较少,但对于框架开发者或者需要深度定制 Java 应用的开发者来说,这是一个非常重要的工具。理解 ClassLoader 的工作机制,能帮助我们更好地理解 Java 程序的运行原理,还能指导我们编写出更高效的代码。ClassLoader 的主要功能是将.class文件加载到 JVM(Java 虚拟机)中,使程序能够正常运行。不过,JVM 在启动时并不会一次性将所有的类文件加载到内存中,而是根据需要动态加载。

weixin_60669486的博客 1450

LearningToRank(LTR)排序算法LGBMRanker的原理和使用

1. 写在前面 在最近新闻推荐的比赛中, 接触到了一个排序模型LGBMRanker, 该模型与普通的分类模型LGBMClassifier不太一样, 普通的分类模型在进行推荐的时候, 往往是先预测某个商品或者文章用户会不会点击, 也就是它的目标是预测用户点击某篇文章或者某个商品的概率, 然后根据这个概率值进行排序, 排完之后,把最靠前的几个返回回来给用户进行推荐。 而LGBRanker模型, 它不关心用户点击某篇文章的概率, 而是根据用户点击或者不点击的这个行为, 直接去预测最后商品或者文章的一个相对顺序,

Miracle8070 1万+

java中的ClassLoader详解

原文 本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 ClassLoader翻译过来就是类加载器,普通的java开发者其实用到的不多,但对于某些框架开发者来说却非常常见。理解ClassLoader的加载机制,也有利于我们编写出更高效的代码。ClassLoader的具体作用就是将class文件加载到jvm虚拟机中去,程序就可以正确运行了。但是,jvm启动的时候,并不会一次性加载所有的class文件,而是根据需要去动态加载。想想也是的,一次性加载那么多jar包那么多class,那内存不崩溃。

ss810540895的博客 5733

5.6华为OD机试真题 新系统 - 匹配命令行前缀关键字 (Java/Py/C/C++/Js/Go)

5.6华为OD机试真题 新系统 - 匹配命令行前缀关键字本文整理华为 OD 机试新系统机考真题库,涵盖高频考点精析与完整题目内容,提供 C 语言、Java、C++、Python、Go、JavaScript 多语言源码实现,搭配详细解题思路讲解,并支持在线 OJ 刷题练习,助力高效备考华为 OD 机试新系统。

算法大师! 2123

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Java ClassLoader

一、什么是ClassLoader 顾名思义,即是类加载器,具体作用就是将.class文件加载到JVM虚拟机中去,程序就可以正确运行了。 二、认识.class文件 Java是解释性语言,编写的代码都是.java文件,需要经过compile(编译)成.class文件才能运行。拿入门Hello World来讲: HelloWorld.java public class HelloWorld{ ...

假装你是大灰狼的专栏 13万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Java ClassLoader机制深度解析:从原理到实战应用

本文详细介绍Java ClassLoader,并结合图表进行详细说明。

一起探索IT的世界 1155

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Java中的ClassLoader

ClassLoader简介 ClassLoader负责在运行时将Java类动态加载到JVM中,而且ClassLoader是JRE的一部分。因此,由于ClassLoader的存在,JVM无需了解底层文件和文件系统即可运行Java程序。 而且,ClassLoader并不会一次把所有Java类加载到内存中,而是在应用程序需要的时候加载。这就是ClassLoader发挥作用的地方,它们负责将类加载到内存中。 内置的CLassLoader的类型 下面是一个简单的例子,它展示了不同的类被哪种ClassLoade

DDDInJava 627

Java classloader

本文介绍了Java类加载器的继承性和隔离性。类加载器分为四个层级:Bootstrap、Extension、System和Plugin,遵循"父委托"机制。隔离性体现在父级不能调用子级类、同级加载器不能互相调用、无法获取Bootstrap实例。文章展示了如何使用URLClassLoader加载外部jar包,并提供了自定义ClassLoader的示例代码,通过读取jar文件字节码实现类加载。最后指出规范实现应优先调用父加载器并缓存已加载类,以提升性能。

你的指尖有改变世界的力量 986

java classloader_Java Classloader原理分析

类的加载过程指通过一个类的全限定名来获取描述此类的二进制字节流,并将其转化为方法区的数据结构,进而生成一个java.lang.Class对象作为方法区这个类各种数据访问的入口。这个过程通过Java中的类加载器(ClassLoader)来完成。类装载器是用来把类(class)装载进JVM的。JVM规范定义了两种类型的类装载器:启动内装载器(bootstrap)和用户自定义装载器(user-defin...

weixin_29495679的博客 338

Java的ClassLoader加载机制

一、ClassLoader的概念 Java程序在运行的时候,JVM通过类加载机制(ClassLoader)把class文件加载到内存中,只有class文件被载入内存,才能被其他class引用,使程序正确运行起来. 二、ClassLoader的分类  Java中的ClassLoader有三种. 1. Bootstrap ClassLoader  由C++写的,由JVM启动. 启动

Dennis-Android的博客 5311

JAVA基础 - 如何使用ClassLoader?

ClassLoader,类加载器。用于将CLASS文件动态加载到JVM中去,是所有类加载器的基类(Bootstrap ClassLoader不继承自ClassLoader),所有继承自抽象的ClassLoader的加载器,都会优先判断是否被父类加载器加载过,防止多次加载。

记录并分享 1389

Java基石--Java发动机ClassLoader

继承自ClassLoader重写findClass@Overridethrow new ClassNotFoundException("无法找到类: " + name);if (!findClass()里先将.class文件读取到byte[]字节数组里,再调用系统的defineClass转换为Class结构。// 加载类Class<?如此一来,通过自定义加载器,我们就可以加载位于其它位置的.class文件,甚至是网络文件等。再来看自定义ClassLoader加载过程。

1190

【Java】【JVM】ClassLoader机制解析

JVM ClassLoader机制解析 摘要:本文深入解析JVM ClassLoader机制,重点介绍了类加载器层级结构、双亲委派模型及其工作原理。ClassLoader体系包含Bootstrap、Extension和Application三个核心加载器,采用双亲委派机制确保类加载的安全性和唯一性。文章通过代码示例验证了类加载器的层级关系,并分析了双亲委派模型在JDK源码中的实现。同时探讨了SPI机制如何破坏双亲委派规则,以及线程上下文类加载器(TCCL)如何解决这一问题。最后通过JDBC驱动加载的源码分析

瘦到被风吹走的博客 1152

java ClassLoader

ClassLoader(类加载器)是 Java 虚拟机(JVM)用来加载.class文件(字节码)的对象。它负责把类的字节码文件读进内存,并转换成 JVM 可以识别的 Class 对象。简单来说,你写的 Java 代码会被编译成.class文件,运行时由 ClassLoader 加载进 JVM,才能被执行。是 JVM 加载类和资源的工具,决定了类的来源和隔离性。双亲委派机制保证了安全和一致性,防止类被重复加载或被恶意篡改。

liu_rockefeller的博客 813
上一篇: Java常用类:Class类
下一篇: Java常用类:System
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值