点击上方“方志朋”,选择“设为星标”

回复”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 有什么区别?相关推荐

  1. Class.forName和ClassLoader有什么区别

    本文来说下Class.forName 和 ClassLoader 有什么区别 文章目录 概述 实例测试 应用场景 本文小结 概述 在 java 中 Class.forName() 和 ClassLoa ...

  2. 获取第二个匹配class_面试题:Class.forName 和 ClassLoader 有什么区别?

    来源:http://t.cn/AiQQ7dwi 在 java 中 Class.forName() 和 ClassLoader 都可以对类进行加载.ClassLoader 就是遵循双亲委派模型最终调用启 ...

  3. 面试题鬼的很:Class.forName 和 ClassLoader 有什么区别?

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"加群"加入公众号专属技术群 来源 | http://rrd.me/eW9gG 在 ja ...

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

    作者 | 纪莫 来源 | dwz.date/eUc 在 Java 中 Class.forName() 和 ClassLoader 都可以对类进行加载.ClassLoader 就是遵循双亲委派模型最终调 ...

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

    一 Java类装载过程 装载:通过累的全限定名获取二进制字节流,将二进制字节流转换成方法区中的运行时数据结构,在内存中生成Java.lang.class对象: 链接:执行下面的校验.准备和解析步骤,其 ...

  6. 【重难点】【JVM 02】反射在 JVM 层面的实现流程、Class.forName() 和 ClassLoader.loadClass 的区别

    [重难点][JVM 02]反射在 JVM 层面的实现流程.Tomcat 的请求流程和 JVM 的类加载情况 文章目录 [重难点][JVM 02]反射在 JVM 层面的实现流程.Tomcat 的请求流程 ...

  7. Class.forName 和 ClassLoader 到底有啥区别?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者 | 纪莫 来源 | https://www.cnblogs. ...

  8. 在 Java 的反射中,Class.forName 和 ClassLoader 的区别

    前言 最近在面试过程中有被问到,在Java反射中Class.forName()加载类和使用ClassLoader加载类的区别.当时没有想出来后来自己研究了一下就写下来记录一下. 解释 在java中Cl ...

  9. class mywnd : pubic qwidget是什么意思_学了这么久java反射,你知道class.forName和classloader的区别吗?...

    前两天头条有朋友留言说使用class.forName找不到类,可以使用classloader加载.趁此机会总结一下,正好看到面试中还经常问到. 一.类加载机制 上面两种加载类的方式说到底还是为了加载一 ...

最新文章

  1. Linux下的mysql设置表不区分大小写
  2. 获取指定目录下的所有文件名
  3. nginx-exporter安装使用
  4. html文本弹性,HTML5 很有趣的文本蹦床/弹性弯曲动效
  5. 招聘| 基因组所Yuwen Liu团队诚聘科研人员
  6. 使用 Python 实现鼠标键盘自动化
  7. Geotools之“Hello World”——打开本地shp文件并显示
  8. 一种新的排序算法,基于优先队列
  9. opencv 利用轮廓检索函数实现字母匹配(图像匹配)
  10. 从现有数据创建 XML 架构和数据集
  11. 金山视频云推出QUIC+,畅快直播再升级
  12. Loadrunner12实现手机APP压力测试
  13. 多页pdf怎样合并成一页?
  14. 如何获取最好权限删除顽固文件Mac系统
  15. 最详细iOS打包流程
  16. 清华大学计算机秦凌霄,海南25名考生获得北大清华自主招生入选资格
  17. 2021SC@SDUSC HBase(十三)项目代码分析——WAL写入
  18. 如何设置UEFI的系统启动顺序
  19. stm32毕业设计 单片机智能路灯设计与实现
  20. MarkDown高阶语法手册

热门文章

  1. Django 模型层(1)
  2. redis.conf配置文件参数说明
  3. BZOJ1901Zju2112 Dynamic Rankings——树状数组套主席树
  4. PAT Basic 1072
  5. 如何实现显示超过10个字符就显示省略号?
  6. Win10系列:VC++调用自定义组件1
  7. 【计算机视觉】EmguCV学习笔记(1)Hello World
  8. 【ACM】杭电OJ 2034
  9. 属于python文件的操作有_Python的文件操作
  10. 厉害了,网易伏羲三篇论文上榜 AI 顶会 ACL