深入探讨:Class.forName() 和 ClassLoader.loadClass() 的区别

news2024/10/5 18:35:15

深入探讨:Class.forName()ClassLoader.loadClass() 的区别

在 Java 中,类的加载是非常关键的部分,特别是当我们要动态加载类时,经常会接触到两个常用方法:Class.forName()ClassLoader.loadClass()。尽管它们都用于类加载,但在机制和用法上存在一些重要区别。本文将深入探讨这两个方法的区别、适用场景以及它们在类加载过程中的行为。

一、基本概念
  • Class.forName(String className)
    这个方法用于加载指定名称的类,并立即对该类进行初始化。换句话说,调用 Class.forName() 不仅会加载类,还会执行类中的静态块、静态变量初始化等操作。
  • ClassLoader.loadClass(String className)
    这个方法只会加载类文件,但不会自动对类进行初始化。也就是说,类的静态块和静态变量的初始化是在类第一次被使用时才会执行,而不是在加载时立即执行。
二、两者的主要区别
1. 是否执行类初始化
  • Class.forName():不仅加载类,还会立即执行类的静态代码块和静态成员的初始化。
  • ClassLoader.loadClass():仅仅加载类,不会立即执行初始化操作。初始化是在类第一次被使用时(例如,访问类的静态方法或静态字段)才会进行。

示例:

// 假设有一个类 TestClass
public class TestClass {
    static {
        System.out.println("TestClass 被初始化了");
    }
}

public class TestClassDemo {
    public static void main(String[] args) throws Exception {
        // 调用 Class.forName
        Class.forName("TestClass"); 
        // 输出结果:TestClass 被初始化了
        
        // 调用 ClassLoader.loadClass
        ClassLoader classLoader = ClassLoader.getSystemClassLoader();
        classLoader.loadClass("TestClass");
        // 输出结果:无输出,TestClass 没有被初始化
    }
}
2. 参数和返回值的不同
  • Class.forName():通常接受一个 String 参数(类的完全限定名),并返回 Class<?> 对象。如果类不存在或加载失败,会抛出 ClassNotFoundException
  • ClassLoader.loadClass():和 Class.forName() 类似,也接受类名作为参数并返回对应的 Class 对象,但它不强制进行类的初始化。
3. 是否可以指定类加载器
  • Class.forName():默认使用调用者的类加载器(通常是应用类加载器)。
  • ClassLoader.loadClass():你可以明确指定你想要使用的类加载器。例如,你可以通过 getClassLoader() 或其他方式获取自定义的类加载器来加载类。

示例:

// 使用自定义的类加载器
ClassLoader classLoader = new CustomClassLoader();
Class<?> myClass = classLoader.loadClass("com.example.MyClass");
4. 反射的常见应用

Class.forName() 经常和反射一起使用,因为它在加载类的同时,会使类的静态块立即执行,这在 JDBC 等场景下非常有用。例如:

// JDBC 中常见的用法
Class.forName("com.mysql.cj.jdbc.Driver");

这行代码会加载并初始化 MySQL 的 JDBC 驱动类,注册数据库驱动程序到 DriverManager

三、适用场景
  • Class.forName():适用于你需要立即加载并初始化类的场景,特别是当你需要类的静态代码执行时。例如,JDBC 驱动的加载。
  • ClassLoader.loadClass():适用于只需要加载类但不需要立即执行类的静态代码的场景。当你想延迟类的初始化,或者只关心类的加载而不是其初始化时,这是一个更好的选择。
四、总结
特性Class.forName()ClassLoader.loadClass()
是否加载类
是否初始化类是(立即初始化)否(延迟到类第一次使用时)
可否指定类加载器否(使用默认类加载器)是(可以指定自定义类加载器)
常见使用场景需要立即执行类的静态代码块,常见于 JDBC 等只需要加载类但不希望立即执行静态代码块

总的来说,Class.forName()ClassLoader.loadClass() 各有其特定的应用场景。如果你需要类在加载时立即被初始化并执行静态代码块,Class.forName() 是最合适的选择;如果你只需要延迟加载,或者只关心类的加载而不希望初始化,那么 ClassLoader.loadClass() 则更加灵活。

希望这篇文章能够帮助你更好地理解 Java 中的类加载机制以及如何选择合适的方法来加载类!如果你有任何问题或补充,欢迎在评论区讨论。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2190321.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

3dsMax添加天空盒

点击渲染&#xff0c;环境 &#xff0c; 点击位图 找到要设置的天空HDR&#xff0c;可以使用HDR(EXR)贴图 一个可以下载HDR贴图的网站 https://polyhaven.com/hdris在渲染的时候不要使用使用微软输入法&#xff0c;3dsmax会卡死&#xff0c; 在渲染的时候不要使用使用微软…

胤娲科技:AI重塑会议——灵动未来,会议新纪元

你是否曾经历过这样的会议场景&#xff1a;会议纪要不准确&#xff0c;人名张冠李戴&#xff1b;错过会议&#xff0c;却无从回顾关键内容&#xff1b;会议效率低下&#xff0c;时间白白流逝&#xff1f; 这些问题仿佛成了现代会议的“顽疾”。然而&#xff0c;随着AI技术的飞速…

苹果荔枝柠檬梨柿子数据集 水果数据集 树上1500张 带标注 voc yolo 5类

苹果荔枝柠檬梨柿子数据集 水果数据集 树上1500张 带标注 voc yolo 5类 苹果荔枝柠檬梨柿子数据集 名称 苹果荔枝柠檬梨柿子数据集 (Apple, Litchi, Lemon, Pear, Persimmon Dataset) 规模 图像数量&#xff1a;1498张图像。类别&#xff1a;5种水果类别。标注个数&#xff…

linux基础指令的认识

在正式学习linux前&#xff0c;可以简单认识一下linux与win的区别 win&#xff1a;是图形界面&#xff0c;用户操作更简单&#xff1b;在刚开始win也是黑屏终端 指令操作&#xff0c;图形界面就是历史发展的结果。Linux&#xff1a;也存在图形界面比如desktop OS&#xff1b;但…

Redis实现点赞

部分实体类 TableId(value "id", type IdType.AUTO)private Long id;/*** 商户id*/private Long shopId;/*** 用户id*/private Long userId;/*** 用户图标*/TableField(exist false)private String icon;/*** 用户姓名*/TableField(exist false)private String …

lxml安装失败的一个解决方案

下载离线安装包&#xff0c;网址 https://pypi.org/simple/lxml/需要对应自己的python版本&#xff0c;网上教程很多&#xff0c;不再赘述 下载完成后将该文件&#xff0c;重命名&#xff08;下面是下载好的文件&#xff0c;上面是重命名的文件&#xff0c;就是在第二个版本&a…

【Linux】进程周边之优先级

目录 一、优先级 1.为什么要有进程优先级&#xff1f; 2.什么是进程优先级&#xff1f; 3.优先级的初始设定 3.1 PRI 和 NI 3.2如何修改优先级&#xff1f;&#xff08;sudo/root&#xff09; 3.2.1 概念&#xff1a; 3.2.2 如何查看进程的优先级&#xff1f; 3.3.3 或…

【深度学习】自动微分——Autodiff or Autograd?

论文 [1].CSC321 Lecture 10: Automatic Differentiation [2].Automatic Differentiation in Machine Learning:a Survey 关键点总结&#xff1a; 雅可比矩阵&#xff1a;对于多变量函数 y ⃗ f ( x ⃗ ) \vec{y} f(\vec{x}) y ​f(x )&#xff0c;其梯度矩阵&#xff08;…

GPT新功能Canvas!对普通用户最友好的功能!

原文链接&#xff1a;GPT4新功能Canvas!对普通用户最友好的功能&#xff01; ChatGPT更新了一个极度优雅&#xff0c;对普通人极度友好的功能。 而且&#xff0c;顺带&#xff0c;又碾死了一批AI赛道里&#xff0c;做AI文本编辑和Code Copilot的初创企业&#xff0c;一波端掉…

自动驾驶核心技术:感知融合、规划决策、控制执行

1、前言 简单来说&#xff0c;实现自动驾驶需要解决三个核心问题&#xff1a;“我在哪?我要去哪?我该如何去?”能完整解决这三个问题就是真正的自动驾驶。 目前&#xff0c;自动驾驶汽车关键技术主要包括环境感知、精准定位、决策与规划、控制与执行、高精地图与车联网V2X以…

ZYNQ:GPIO 之 MIO 按键中断实验

实验目的 使用底板上的 PS 端的用户按键 PS_KEY1 通过中断控制核心板上 LED2 的亮灭 简介 Zynq 芯片的 PS 部分是基于使用双核 Cortex-A9 处理器和 GIC pl390 中断控制器的 ARM 架构。中断结 构与 CPU 紧密链接&#xff0c;并接受来自 I/O 外设&#xff08;IOP&#xff09…

P4240 毒瘤之神的考验

毒瘤之神的考验 - 洛谷 定义 猜想与有关 发现上式1-1 上下两边乘gcd(i,j)有 带入1-1有 化简 n<m 经典代换Tke eT/k 然后化简不了了 这个时候我们可以把一部分看出一个整体 分析这两个函数&#xff0c;发现f(x) 可以在下预处理出来 g(x,y)有以下递推式 因此也可以在下处理…

三、流程控制

流程控制 选择结构&#xff08;if-else&#xff09;选择结构&#xff08;when&#xff09;循环结构&#xff08;for&#xff09;循环结构&#xff08;while&#xff09; 经过前面的学习&#xff0c;我们知道&#xff0c;程序都是从上往下依次运行的&#xff0c;但是&#xff0c…

事件抽取(Event Extraction, EE)

一、引言 事件抽取&#xff08;Event Extraction, EE&#xff09;是信息抽取领域中的一个重要任务&#xff0c;旨在从非结构化文本中识别和抽取事件相关的信息。事件抽取通常包括识别事件触发词、事件类型以及事件中的参与者、时间、地点等元素&#xff0c;最终将这些信息结构…

【进阶OpenCV】 (4)--图像拼接

文章目录 图像拼接1. 读取图片2. 计算图片特征点及描述符3. 建立暴力匹配器4. 特征匹配5. 透视变换6. 图像拼接 总结 图像拼接 图像拼接是一项将多张有重叠部分的图像&#xff08;这些图像可能是不同时间、不同视角或者不同传感器获得的&#xff09;拼成一幅无缝的全景图或高分…

论文翻译 | Model-tuning Via Prompts Makes NLP Models Adversarially Robust

摘要 近年来&#xff0c;NLP从业者集中于以下实践:(i)导入现成的预训练(掩码)语言模型;(ii)在CLS令牌的隐藏表示(随机初始化权重)上附加多层感知器;(iii)在下游任务(MLP-FT)上微调整个模型。这一过程在标准的NLP基准上产生了巨大的收益&#xff0c;但这些模型仍然很脆弱&#x…

mysql单表查询·3

准备好表 create table product(id int primary key,name varchar(32),price double,category varchar(32) ); # 插入数据 INSERT INTO product(id,name,price,category) VALUES(1,联想,5000,c001); INSERT INTO product(id,name,price,category) VALUES(2,海尔,3000,c001); I…

加密与安全_HOTP一次性密码生成算法

文章目录 HOTP 的基础原理HOTP 的工作流程HOTP 的应用场景HOTP 的安全性安全性增强措施Code生成HOTP可配置项校验HOTP可拓展功能计数器&#xff08;counter&#xff09;计数器在客户端和服务端的作用计数器的同步机制客户端和服务端中的计数器表现服务端如何处理计数器不同步计…

好用的苹果笔推荐!五大高品质王者款!附避坑宝典助你选购无忧!

现在平板和电容笔在一定程度上可以替代传统的笔和纸&#xff0c;很多用户在购置iPad后&#xff0c;急需找到一款好用的电容笔。但由于苹果原装笔的价格太过高昂&#xff0c;让许多人不得不选择平替电容笔&#xff01;下面我就为大家推荐五款高品质的电容笔&#xff0c;并分享几…

单细胞hdWGCNA分析学习和整理

hdWGCNA的分析逻辑是跟bulkRNA数据中的WGCNA基本一样&#xff0c;只是hdWGCNA中多了一步metacell过程&#xff0c;有助于减少无用的信息(单细胞数据有很多零值&#xff0c;会影响分析结果)。 WGCNA的基础信息可见既往推文: https://mp.weixin.qq.com/s/2Q37RcJ1pBy_WO1Es8upIg…