面试官 | Class.forName 和 ClassLoader 有什么区别?

作者 | 纪莫

来源 | dwz.date/eUc

在 Java 中 Class.forName() 和 ClassLoader 都可以对类进行加载。ClassLoader 就是遵循双亲委派模型最终调用启动类加载器的类加载器,实现的功能是“通过一个类的全限定名来获取描述此类的二进制字节流”,获取到二进制流后放到 JVM 中。Class.forName() 方法实际上也是调用的 CLassLoader 来实现的。

Class.forName(String className);这个方法的源码是:

最后调用的方法是 forName0 这个方法,在这个 forName0 方法中的第二个参数被默认设置为了 true,这个参数代表是否对加载的类进行初始化,设置为 true 时会类进行初始化,代表会执行类中的静态代码块,以及对静态变量的赋值等操作。

也可以调用 Class.forName(String name, boolean initialize,ClassLoader loader) 方法来手动选择在加载类的时候是否要对类进行初始化。Class.forName(String name, boolean initialize,ClassLoader loader) 的源码如下:

源码中的注释只摘取了一部分,其中对参数 initialize 的描述是:if {@code true} the class will be initialized. 意思就是说:如果参数为 true,则加载的类将会被初始化。

举例

下面还是举例来说明结果吧:一个含有静态代码块、静态变量、赋值给静态变量的静态方法的类。

测试方法:

运行结果:

根据运行结果得出 Class.forName 加载类是将类进了初始化,而 ClassLoader 的 loadClass 并没有对类进行初始化,只是把类加载到了虚拟机中。

应用场景

在我们熟悉的 Spring 框架中的 IOC 的实现就是使用的 ClassLoader。

而在我们使用 JDBC 时通常是使用 Class.forName() 方法来加载数据库连接驱动。这是因为在 JDBC 规范中明确要求 Driver(数据库驱动)类必须向 DriverManager 注册自己。

以 MySQL 的驱动为例解释:

我们看到 Driver 注册到 DriverManager 中的操作写在了静态代码块中,这就是为什么在写 JDBC 时使用 Class.forName() 的原因了。

【END】

近期热文

 
  • 面试珍藏:最常见的200多道Java面试题

  • 被一个熟悉的面试题问懵了:String...

  • 面试官:如何实现幂等性校验?

  • 年终盘点 | 2019年Java面试题汇总篇(附答案)

关注下方二维码,订阅更多精彩内容

朕已阅 

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

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

相关文章

微信公众号使用Chrome插件:Markdown Nice优化微信公众号排版教程

Markdown Nice 是一个为了解决微信公众号排版而生的 Markdown 编辑器,当前有在线编辑器和 Chrome 插件 2 种产品形态。 下面介绍Chrome 插件:Markdown Nice 一、下载和安装Markdown Nice 1.从 墨滴 网站下载mdnice谷歌浏览器插件,如下图&a…

面试官 | 如何优雅的设计Java 异常?

作者 | lrwinx来源 | lrwinx.github.io异常处理是程序开发中必不可少操作之一,但如何正确优雅的对异常进行处理确是一门学问。异常的类别正如我们所知道的,java中的异常的超类是java.lang.Throwable(后文省略为Throwable),它有两个比较重要的子类,java.l…

微型php框架 include/conf.class.php

<?phpdefined(ACC)||exit(Access Denied);// 配置文件读取类class conf {protected static $ins null;protected $cfg array(db>java0620);public static function getIns() {if(self::$ins null) {self::$ins new self();}return self::$ins;}final protected func…

3.Python Django之GET请求和POST请求及响应处理

一、请求中的方法 方法描述GET请求指定的页面信息&#xff0c;并返回实体主体。HEAD类似于GET请求&#xff0c;只不过返回的响应中没有具体的内容&#xff0c;用于获取报头。POST向指定资源提交数据进行处理请求&#xff08;例如&#xff1a;提交表单或者上传文件&#xff09;…

面试官 | Java中的注解是如何工作的?

自Java5.0版本引入注解之后&#xff0c;它就成为了Java平台中非常重要的一部分。开发过程中&#xff0c;我们也时常在应用代码中会看到诸如Override&#xff0c;Deprecated这样的注解。这篇文章中&#xff0c;我将向大家讲述到底什么是注解&#xff1f;为什么要引入注解&#x…

Linux mint 17中文输入法安装,改动linux mint与windows7双系统启动顺序

安装好linux mint17后&#xff0c;进入mint系统&#xff0c;首先须要一个比較合适的中文输入法。 一、首先迎来的就是安装中文输入法了&#xff0c;之前听说搜狗为ubuntu kinly定制了输入法&#xff0c;所以就想安装搜狗输入法&#xff0c;可是搜索了多个教程并不起作用&#x…

Linux debian安装Typora教程

Typora简介 ​ Typora是一款轻便简洁的Markdown编辑器&#xff0c;它支持即时渲染技术&#xff0c;这也是与其他Markdown编辑器最显著的区别。即时渲染使得你写Markdown就像写Word文档一样流畅自如&#xff0c;不像其他编辑器有编辑栏和显示栏。 下载安装包 官网下载较慢&am…

优秀的代码原来是这样分层的

作者 | 咖啡拿铁来源 | t.cn/RdrmI7i1、背景说起应用分层&#xff0c;大部分人都会认为这个不是很简单嘛 就controller&#xff0c;service, mapper三层。看起来简单&#xff0c;很多人其实并没有把他们职责划分开&#xff0c;在很多代码中,controller做的逻辑比service还多,se…

面试官 | 什么是 Lambda?该如何使用?

作者 | Mingqi来源 | zhihu.com/question/20125256/answer/3241213081.什么是Lambda?我们知道&#xff0c;对于一个Java变量&#xff0c;我们可以赋给其一个“值”。如果你想把“一块代码”赋给一个Java变量&#xff0c;应该怎么做呢&#xff1f;比如&#xff0c;我想把右边那…

最长递增子序列和网易去除最少使从左向右递增又递减问题

&#xff08;1&#xff09;最长递增子序列问题 有两种方法&#xff1a;&#xff08;1&#xff09;动态规划方法&#xff08;2&#xff09;类似二分查找的方法O&#xff08;nlogn&#xff09; 动态规划方法&#xff1a; 以i结尾的序列的最长递增子序列和其[0, i - 1]“前缀”的最…

Linux debian 11上安装 Google Chrome浏览器教程

Google Chrome简介 Google Chrome是世界上最受欢迎的网络浏览器。它是为现代网络构建的快速&#xff0c;安全的浏览器。Chrome不是开放源代码的浏览器&#xff0c;也不包含在官方Debian存储库中。它基于Chromium&#xff0c;这是一个默认Debian Buster存储库中可用的开源浏览器…

面试官 | 线程间是如何通信的?

作者 | wingjay来源 | wingjay.com正常情况下&#xff0c;每个线程独立完成自己的任务就结束了&#xff0c;但某些特殊情况下&#xff0c;我们需要多个线程来共同完成某项任务&#xff0c;这时就涉及到了线程间通信了。本文涉及到的知识点&#xff1a;thread.join()object.wait…

Linux debian解压和压缩.rar文件教程

一、简介 我们上传到Linux服务器上的文件日常是.zip或.tat.gz的文件&#xff0c;我们可以用相应的命令对文件进行解压。有时会遇到.rar文件。本次使用rar软件版本是5.6.0。官方网站为http://www.rarlab.com/ 二、下载和安装rar文件 1.创建文件夹 [rootdoudou ~]# mkdir /us…

windos手工扩展分区

为什么80%的码农都做不了架构师&#xff1f;>>> windows 2003系统下手工扩展分区&#xff08;2008系统直接在磁盘管理里扩展卷即可&#xff09; 1、虚拟机关机&#xff0c;将目标磁盘扩展到所需大小 2、开机&#xff0c;进入命令行模式 3、diskpart 进入diskpart工…

面试突击 | 彻底搞定 JVM 这几道高频面试题

前言 Java 相比 C/C 最显著的特点便是引入了自动垃圾回收 (下文统一用 GC 指代自动垃圾回收)&#xff0c;它解决了 C/C 最令人头疼的内存管理问题&#xff0c;让程序员专注于程序本身&#xff0c;不用关心内存回收这些恼人的问题&#xff0c;这也是 Java 能大行其道的重要原因之…

Linux五种清理系统垃圾的方式

​ Linux系统使用时间长了&#xff0c;安装了很多软件&#xff0c;更新了不少的软件包&#xff0c;会导致Linux系统反应速度严重下降。下面有5种清理Linux系统下冗余垃圾的命令&#xff0c;总共有sudo apt-get下的clean、autoclean、autoremove、remove、purge。 一、clean命令…

Linux——curl(转)

先介绍curl工具的使用&#xff0c;在其他文章中介绍如何使用curl发送Identity API linux curl是一个利用URL规则在命令行下工作的文件传输工具。它支持文件的上传和下载&#xff0c;所以是综合传输工具&#xff0c;但按传统&#xff0c;习惯称url为下载工具。  一&#xff0c…

阿里面试官给你的一些忠告,这样做肯定错不了!附视频

作者 | 梦游的龙猫来源 | http://dwz.win/2pU近期面试了许多&#xff0c;真的是许多同学&#xff0c;讲道理其实我是比较有耐心的面试官&#xff0c;但是还是忍不住想要吐槽&#xff0c;因此写下这篇文章&#xff0c;一方面希望可以帮助到正在面试&#xff0c;或者在来面试路上…

Linux debian ubuntu安装.deb包教程

deb包是debian&#xff0c;ubuntu等LINUX发行版的软件安装包。 首先deb包已下载保存电脑上&#xff0c;deb包安装方法有两种&#xff1a; 一、可以直接“双击”安装 二、手动安装 使用终端命令行安装 1.使用ctrl alt T组合键打开终端&#xff0c;输入并执行下面命令&…

VMware vCloud® Suite 5.5功能介绍

2013年8月26日在旧金山举办的VMworld大会上&#xff0c;VMware宣布推出VMware vCloud Suite 5.5&#xff0c;它是全面且集成的云基础架构与管理软件套件。新版本让客户能够利用软件定义的数据中心架构&#xff0c;建设并运营基于vSphere的私有云。VMware vCloud Suite 5.5让客户…