面试题:Class.forName 和 ClassLoader 有什么区别?
点击上方“方志朋”,选择“设为星标”
回复”666“获取新整理的面试资料
来源:http://t.cn/AiQQ7dwi
在 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() 的原因了。
热门内容: 如何设计权限管理模块
SpringBoot+Mybatis+ Druid+PageHelper 实现多数据源并分页
17 个方面,综合对比 Kafka、RabbitMQ、RocketMQ、ActiveMQ 四个分布式消息队列
Mybatis的工作原理,你了解过吗?
图解 Java 垃圾回收机制,写得非常好!最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。
获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。
明天见(。・ω・。)ノ♡
面试题:Class.forName 和 ClassLoader 有什么区别?相关推荐
- Class.forName和ClassLoader有什么区别
本文来说下Class.forName 和 ClassLoader 有什么区别 文章目录 概述 实例测试 应用场景 本文小结 概述 在 java 中 Class.forName() 和 ClassLoa ...
- 获取第二个匹配class_面试题:Class.forName 和 ClassLoader 有什么区别?
来源:http://t.cn/AiQQ7dwi 在 java 中 Class.forName() 和 ClassLoader 都可以对类进行加载.ClassLoader 就是遵循双亲委派模型最终调用启 ...
- 面试题鬼的很:Class.forName 和 ClassLoader 有什么区别?
点击上方"朱小厮的博客",选择"设为星标" 后台回复"加群"加入公众号专属技术群 来源 | http://rrd.me/eW9gG 在 ja ...
- 面试官 | Class.forName 和 ClassLoader 有什么区别?
作者 | 纪莫 来源 | dwz.date/eUc 在 Java 中 Class.forName() 和 ClassLoader 都可以对类进行加载.ClassLoader 就是遵循双亲委派模型最终调 ...
- 反射中Class.forName()和ClassLoader.loadClass()的区别
一 Java类装载过程 装载:通过累的全限定名获取二进制字节流,将二进制字节流转换成方法区中的运行时数据结构,在内存中生成Java.lang.class对象: 链接:执行下面的校验.准备和解析步骤,其 ...
- 【重难点】【JVM 02】反射在 JVM 层面的实现流程、Class.forName() 和 ClassLoader.loadClass 的区别
[重难点][JVM 02]反射在 JVM 层面的实现流程.Tomcat 的请求流程和 JVM 的类加载情况 文章目录 [重难点][JVM 02]反射在 JVM 层面的实现流程.Tomcat 的请求流程 ...
- Class.forName 和 ClassLoader 到底有啥区别?
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者 | 纪莫 来源 | https://www.cnblogs. ...
- 在 Java 的反射中,Class.forName 和 ClassLoader 的区别
前言 最近在面试过程中有被问到,在Java反射中Class.forName()加载类和使用ClassLoader加载类的区别.当时没有想出来后来自己研究了一下就写下来记录一下. 解释 在java中Cl ...
- class mywnd : pubic qwidget是什么意思_学了这么久java反射,你知道class.forName和classloader的区别吗?...
前两天头条有朋友留言说使用class.forName找不到类,可以使用classloader加载.趁此机会总结一下,正好看到面试中还经常问到. 一.类加载机制 上面两种加载类的方式说到底还是为了加载一 ...
最新文章
- Linux下的mysql设置表不区分大小写
- 获取指定目录下的所有文件名
- nginx-exporter安装使用
- html文本弹性,HTML5 很有趣的文本蹦床/弹性弯曲动效
- 招聘| 基因组所Yuwen Liu团队诚聘科研人员
- 使用 Python 实现鼠标键盘自动化
- Geotools之“Hello World”——打开本地shp文件并显示
- 一种新的排序算法,基于优先队列
- opencv 利用轮廓检索函数实现字母匹配(图像匹配)
- 从现有数据创建 XML 架构和数据集
- 金山视频云推出QUIC+,畅快直播再升级
- Loadrunner12实现手机APP压力测试
- 多页pdf怎样合并成一页?
- 如何获取最好权限删除顽固文件Mac系统
- 最详细iOS打包流程
- 清华大学计算机秦凌霄,海南25名考生获得北大清华自主招生入选资格
- 2021SC@SDUSC HBase(十三)项目代码分析——WAL写入
- 如何设置UEFI的系统启动顺序
- stm32毕业设计 单片机智能路灯设计与实现
- MarkDown高阶语法手册