反射中的 Class.forName() 与 ClassLoader.loadClass() 的区别
在Java中,类加载器把一个类加载进Java虚拟机中,要经过三个步骤来完成:加载、链接和初始化,其中链接又可以分成验证、准备和解析三步,除了解析外,其它步骤是严格按照顺序完成的,各个步骤的主要工作如下:
- 加载:查找和导入类或接口的二进制数据;
- 链接:执行下面的校验、准备和解析步骤,其中解析步骤是可以选择的;
- 验证:检查导入类或接口的二进制数据的正确性;
- 准备:给类的静态变量分配并初始化存储空间;
- 解析:将符号引用转成直接引用;
- 初始化:激活类的静态变量的初始化Java代码和静态Java代码块。

我们可以开始看2者的区别了。
Class.forName(className) 方法,其实调用的方法是Class.forName(className,true,classloader);注意第2个boolean参数,它表示的意思是在加载之后必须初始化。在执行过此方法后,目标对象的静态块代码已经被执行,静态参数也已经被初始化。
再看ClassLoader.loadClass(className) 方法,其实他调用的方法是ClassLoader.loadClass(className,false); 注意看第2个 boolean参数,该参数表示目标对象被加载后不进行链接,这就意味着不会去执行该类静态块中的内容。
反射中的 Class.forName() 与 ClassLoader.loadClass() 的区别的更多相关文章
- 015 反射中的 Class.forName() 与 ClassLoader.loadClass() 的区别
作者:nnngu GitHub:https://github.com/nnngu 博客园:http://www.cnblogs.com/nnngu 简书:https://www.jianshu.com ...
- Class.forName() 与 ClassLoader.loadClass()的区别
看到一个面试题,说说Class.forName() 与 ClassLoader.loadClass()的区别,特意记录一下,方便后续查阅. 在我们写java代码时,通常用这两种方式来动 ...
- 反射中Class.forName()和ClassLoader.loadClass()的区别
一 Java类装载过程 装载:通过累的全限定名获取二进制字节流,将二进制字节流转换成方法区中的运行时数据结构,在内存中生成Java.lang.class对象: 链接:执行下面的校验.准备和解析步骤,其 ...
- Class.forName和ClassLoader.loadClass的区别
Class的装载分了三个阶段,loading,linking和initializing,分别定义在The Java Language Specification的12.2,12.3和12.4. Cla ...
- Class.forName和ClassLoader.loadClass的区别(转载)
Class的装载分了三个阶段,loading,linking和initializing,分别定义在The Java Language Specification的12.2,12.3和12.4.Clas ...
- java两种反射的区别 - Class.forName()和ClassLoader.loadClass()
在理解这两种反射机制之前,需要弄清楚java类的加载机制. 装载:通过类的全限定名获取二进制字节流(二进制的class文件),将二进制字节流转换成方法区中的运行时数据结构,在内存中生成Java.lan ...
- Class.forName和ClassLoader.loadClass等
Class类 首先,Class类里可以记载所有类的属性.方法等信息.这个也就是运行时类别标记,它记录了所有的对象(比如int,MyClass,void,数组等等)对应的类信息. Class对象 JVM ...
- Class.forName和ClassLoader.loadClass的比较
文章出处:http://blog.csdn.net/wikijava/article/details/5576043 Class的装载分了三个阶段,loading,linking和initializi ...
- Class.forname和ClassLoader.loadClass的源码分析
最近在研读<深入理解java虚拟机:JVM高继特性与最佳实践>第二版, 今天想起来很久前,写数据库连接,使用Class.forName,当时没有深究,所以便简单的看了下源码,顺便做了以下记 ...
随机推荐
- Extjs4常见的调试问题
Extjs4常见的调试问题: 1.fireFn.apply of undefined方法名称对不上 2.新增页面居左解决:页面的宽度和高度需要调整,内容items有问题:或者:layout : 'co ...
- vue视频: 自定义指令 && 拖拽 && 自定义键盘信息
v-textv-forv-html 指令: 扩展html语法 自定义指令:1. 自定义属性指令: Vue.directive(指令名称,function(参数){ this.el -> 原生DO ...
- JS替换URL中参数示例
<script type="text/javascript"> var url = window.location.href; url = changeURLArg(u ...
- 传智播客京东商城移动web开发
1.源码笔记 我的源码+笔记(很重要):链接: https://pan.baidu.com/s/1eScieps 密码: 3vyr 感谢传智播客项目相关视频:1.6天链接: https://pan.b ...
- MVC4中使用Html.DropDownList实现级联
本文记录了一个在MVC4中使用PartialView实现级联效果的小例子. 准备工作 首先准备一下要级联的数据,新建两个类:Province和City public class Province { ...
- CF1028E Restore Array 构造
正解:构造 解题报告: 传送门! 是的灵巧还在写构造,,,不知道484我做题太慢的缘故我感觉我做了好久的构造了然而一半的题目都没做完QAQ 要哭出来了QAQ 然后说下这题的解法,开始花了这——么的时间 ...
- mysql查询乱码解决方法
http://blog.csdn.net/u012408083/article/details/52734762 MySQL 命令行查询乱码 编码问题 当使用数据库工具查询数据时显示数据正常,中文也很 ...
- pssh批量远程管理工具
Linux下批量管理工具pssh使用记录 pssh是一款开源的软件,使用python实现,用于批量ssh操作大批量机器:pssh是一个可以在多台服务器上执行命令的工具,同时支持拷贝文件,是同类工具 ...
- PAT 1073 Scientific Notation[字符串处理][科学记数法]
1073 Scientific Notation(20 分) Scientific notation is the way that scientists easily handle very lar ...
- org.apache.ibatis.exceptions.TooManyResultsException的异常排查过程
在查阅测试环境业务日志中的ERROR级别的日志时,发现了有一个Mybatis相关的异常错误org.apache.ibatis.exceptions.TooManyResultsException: E ...