看到一个面试题,说说Class.forName() 与 ClassLoader.loadClass()的区别,特意记录一下,方便后续查阅.     在我们写java代码时,通常用这两种方式来动态加载一个java类,它们是Class.forName() 与 ClassLoader.loadClass(). 但是这两个方法之间也是有一些细微的差别,下面通过写代码实践的方式来看看结果. 一.Class.forName() 方式 (1)理论     查看Class类代码里面的具体实现可知,实质上…
作者:nnngu GitHub:https://github.com/nnngu 博客园:http://www.cnblogs.com/nnngu 简书:https://www.jianshu.com/users/1df20d76ea5c 知乎:https://www.zhihu.com/people/nnngu/posts Class.forName() 与 ClassLoader.loadClass() 大家都知道是反射用来构造类的方法,但是他们的用法还是有一定区别的. 在讲区别之前,我觉得…
一 Java类装载过程 装载:通过累的全限定名获取二进制字节流,将二进制字节流转换成方法区中的运行时数据结构,在内存中生成Java.lang.class对象: 链接:执行下面的校验.准备和解析步骤,其中解析步骤是可以选择的: 校验:检查导入类或接口的二进制数据的正确性:(文件格式验证,元数据验证,字节码验证,符号引用验证) 准备:给类的静态变量分配并初始化存储空间: 解析:将常量池中的符号引用转成直接引用: 初始化:激活类的静态变量的初始化Java代码和静态Java代码块,并初始化程序员设置的变…
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(c…
在Java中,类加载器把一个类加载进Java虚拟机中,要经过三个步骤来完成:加载.链接和初始化,其中链接又可以分成验证.准备和解析三步,除了解析外,其它步骤是严格按照顺序完成的,各个步骤的主要工作如下: 加载:查找和导入类或接口的二进制数据: 链接:执行下面的校验.准备和解析步骤,其中解析步骤是可以选择的: 验证:检查导入类或接口的二进制数据的正确性: 准备:给类的静态变量分配并初始化存储空间: 解析:将符号引用转成直接引用: 初始化:激活类的静态变量的初始化Java代码和静态Java代码块.…
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(cl…
Java中class是如何加载到JVM中的:1.class加载到JVM中有三个步骤    装载:(loading)找到class对应的字节码文件.    连接:(linking)将对应的字节码文件读入到JVM中.    初始化:(initializing)对class做相应的初始化动作.2.Java中两种加载class到JVM中的方式    2.1:Class.forName("className");        其实这种方法调运的是:Class.forName(className…
文章目录 背景 三种方法简单介绍 Class.forName("").newinstance()方式 new方式 classLoader.loadClass("")方式 三种方法的区别 加载的时机可能不同 Class.forName(className)和ClassLoader.loadClass(className)的区别 独特的new加载时机 类加载器不同 效率不同 调用的方法不同 newinstance真正的用途 声明:本文章仅供自己学习,其中引用了大量的其他…
在理解这两种反射机制之前,需要弄清楚java类的加载机制. 装载:通过类的全限定名获取二进制字节流(二进制的class文件),将二进制字节流转换成方法区中的运行时数据结构,在内存中生成Java.lang.class对象.这个时候该类型没有被分配内存,设置默认值,也没有初始化. 链接:执行下面的校验.准备和解析步骤,其中解析步骤是可以选择的: 校验:检查导入类或接口的二进制数据的正确性:(文件格式验证,元数据验证,字节码验证,符号引用验证) 准备:给类的静态变量分配并初始化存储空间: 解析:将常量…
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(cla…