文章目录 背景 三种方法简单介绍 Class.forName("").newinstance()方式 new方式 classLoader.loadClass("")方式 三种方法的区别 加载的时机可能不同 Class.forName(className)和ClassLoader.loadClass(className)的区别 独特的new加载时机 类加载器不同 效率不同 调用的方法不同 newinstance真正的用途 声明:本文章仅供自己学习,其中引用了大量的其他…
    看到一个面试题,说说Class.forName() 与 ClassLoader.loadClass()的区别,特意记录一下,方便后续查阅.     在我们写java代码时,通常用这两种方式来动态加载一个java类,它们是Class.forName() 与 ClassLoader.loadClass(). 但是这两个方法之间也是有一些细微的差别,下面通过写代码实践的方式来看看结果. 一.Class.forName() 方式 (1)理论     查看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(c…
一 Java类装载过程 装载:通过累的全限定名获取二进制字节流,将二进制字节流转换成方法区中的运行时数据结构,在内存中生成Java.lang.class对象: 链接:执行下面的校验.准备和解析步骤,其中解析步骤是可以选择的: 校验:检查导入类或接口的二进制数据的正确性:(文件格式验证,元数据验证,字节码验证,符号引用验证) 准备:给类的静态变量分配并初始化存储空间: 解析:将常量池中的符号引用转成直接引用: 初始化:激活类的静态变量的初始化Java代码和静态Java代码块,并初始化程序员设置的变…
作者: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虚拟机中,要经过三个步骤来完成:加载.链接和初始化,其中链接又可以分成验证.准备和解析三步,除了解析外,其它步骤是严格按照顺序完成的,各个步骤的主要工作如下: 加载:查找和导入类或接口的二进制数据: 链接:执行下面的校验.准备和解析步骤,其中解析步骤是可以选择的: 验证:检查导入类或接口的二进制数据的正确性: 准备:给类的静态变量分配并初始化存储空间: 解析:将符号引用转成直接引用: 初始化:激活类的静态变量的初始化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.forName( )这个方法.通过查询Java Documentation我们会发现使用Class.forName( )静态方法的目的是为了动态加载类.在加载完成后,一般还要调用Class下的newInstance( )静态方法来实例化对象以便操作.因此,单单使用Class.forName( )是动态加载类是没有用的,其最终目的是为了实例化对象.    这里有必要提一下就是Class下的newInstance()和new有什么区别?,…
终于明白为什么加载数据库驱动只用Class.forName()了!!困扰了我2个小时!!希望我写的这个东西对各位有所帮助.      在Java开发特别是数据库开发中,经常会用到Class.forName( )这个方法.通过查询Java Documentation我们会发现使用Class.forName( )静态方法的目的是为了动态加载类.在加载完成后,一般还要调用Class下的newInstance( )静态方法来实例化对象以便操作.因此,单单使用Class.forName( )是动态加载类是…
一.首先,查看Class类中的forName方法,可以发现有如下三个方法,但是我们通常用的是只有一个参数的方法. 简单介绍一下这三个方法: 第一个方法Class.forName("xxx")等同于第二个方法Class.forName("xxx",true,this.getClass().getClassLoader()),第二个布尔类型的参数表示装载该类的时候,是否初始化该类,即是否调用类中的static静态块函数及初始化静态成员变量: 第三个方法forName0是…