当前位置: 首页 > news >正文

Class.forName和ClassLoader.loadClass的比较

详见: http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytpo7

Class的装载分了三个阶段,loading(加载),linking(链接)和initializing(初始化),分别定义在The Java Language Specification的12.2,12.3和12.4。 Class.forName(className)实际上是调用Class.forName(className, true, this.getClass().getClassLoader())。注意第二个参数,是指Class被loading后是不是必须被初始化。 ClassLoader.loadClass(className)实际上调用的是ClassLoader.loadClass(name, false),第二个参数指出Class是否被link。 区别就出来了。Class.forName(className)装载的class已经被初始化,而ClassLoader.loadClass(className)装载的class还没有被link。 一般情况下,这两个方法效果一样,都能装载Class。但如果程序依赖于Class是否被初始化,就必须用Class.forName(name)了。 例如,在JDBC编程中,常看到这样的用法,Class.forName("com.mysql.jdbc.Driver"),如果换成了getClass().getClassLoader().loadClass("com.mysql.jdbc.Driver"),就不行。 为什么呢?打开com.mysql.jdbc.Driver的源代码看看, // // Register ourselves with the DriverManager // static { try { java.sql.DriverManager.registerDriver(new Driver()); } catch (SQLException E) { throw new RuntimeException("Can't register driver!"); } } 原来,Driver在static块中会注册自己到java.sql.DriverManager。而static块就是在Class的初始化中被执行。所以这个地方就只能用Class.forName(className)。 加载:这是由类加载器执行的。该步骤将查找字节码(通常在classpath所指定的路径中查找,但这并非是必须的),并从这些字节码 中创建一个class对象。 链接:在链接阶段将验证类中的字节码,为静态域分配存储空间,并且如果必须的话,将解析这个类创建的对其他类的所有引用。 初始化:如果该类具有超类,则对其初始化,执行静态初始化器和静态初始化块。 初始化对被延迟到了对静态方法(构造器隐式地是静态的)或者非常数静态域进行首次引用时才执行。

相关文章:

  • Mybatis应用学习(3)——Mapper映射文件编写
  • Docker基础之十一: 镜像操作(Dockerfile)
  • ArrayBuffer简析
  • [macOS] Mojave10.14 夜神安卓模拟器启动问题
  • 老李分享:测试金字塔,懂开发的测试工程师更有竞争力
  • solidity智能合约[41]-structdeep
  • ElasticSearch 基础一
  • PPT图表分享一:组织结构图
  • 面向对象(Java中普通代码块,构造代码块,静态代码块区别及代码示例)
  • 内聚性是模块之所以成为模块的原因--一个中心、单一职责
  • ThreadPoolExecutor之一:使用基本介绍
  • HashMap 详解四
  • SQL 拆分含逗号字段
  • Confluence 6 空间
  • 静态Include和动态Include测试并总结
  • exif信息对照
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • Protobuf3语言指南
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 服务器从安装到部署全过程(二)
  • 聊一聊前端的监控
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 如何实现 font-size 的响应式
  • 在electron中实现跨域请求,无需更改服务器端设置
  • 如何在招聘中考核.NET架构师
  • ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  • #HarmonyOS:基础语法
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (day6) 319. 灯泡开关
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (Redis使用系列) Springboot 在redis中使用BloomFilter布隆过滤器机制 六
  • (独孤九剑)--文件系统
  • (多级缓存)多级缓存
  • (太强大了) - Linux 性能监控、测试、优化工具
  • (新)网络工程师考点串讲与真题详解
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • ******IT公司面试题汇总+优秀技术博客汇总
  • .cfg\.dat\.mak(持续补充)
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException
  • .NET 8 编写 LiteDB vs SQLite 数据库 CRUD 接口性能测试(准备篇)
  • .NET设计模式(8):适配器模式(Adapter Pattern)
  • .NET与 java通用的3DES加密解密方法
  • ??javascript里的变量问题
  • [ IOS ] iOS-控制器View的创建和生命周期
  • [ Linux 长征路第二篇] 基本指令head,tail,date,cal,find,grep,zip,tar,bc,unname
  • [ vulhub漏洞复现篇 ] ECShop 2.x / 3.x SQL注入/远程执行代码漏洞 xianzhi-2017-02-82239600
  • [ 代码审计篇 ] 代码审计案例详解(一) SQL注入代码审计案例
  • [20171102]视图v$session中process字段含义
  • [Android] Android ActivityManager
  • [C/C++]数据结构 堆的详解
  • [c++] C++多态(虚函数和虚继承)
  • [ComfyUI进阶教程] animatediff视频提示词书写要点
  • [ERROR ImagePull]: failed to pull image k8s.gcr.io/kube-controller-manager失败