一 Java类装载过程 装载:通过累的全限定名获取二进制字节流,将二进制字节流转换成方法区中的运行时数据结构,在内存中生成Java.lang.class对象: 链接:执行下面的校验.准备和解析步骤,其中解析步骤是可以选择的: 校验:检查导入类或接口的二进制数据的正确性:(文件格式验证,元数据验证,字节码验证,符号引用验证) 准备:给类的静态变量分配并初始化存储空间: 解析:将常量池中的符号引用转成直接引用: 初始化:激活类的静态变量的初始化Java代码和静态Java代码块,并初始化程序员设置的变…
搞清楚两者之间区别前,我们来了解下类加载过程. 一.类加载过程 1.加载 通过一个类的全限定名来获取定义此类的二进制字节流. 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构. 在内存中生成一个代表这个类的Java.lang.class对象,作为方法区这个类的各种数据的访问入口. 2.验证 文件格式验证 元数据验证 字节码验证 符号引用验证 3.准备 准备阶段是正式为类变量(仅被static修饰的变量)分配内存并设置类变量初始值的阶段,这些变量所使用的内存都将在方法区中进行分配.注意…
    看到一个面试题,说说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中Class.forName和classloader都可以用来对类进行加载. Class.forName除了将类的.class文件加载到jvm中之外,还会对类进行解释,执行类中的static块. 而classloader只干一件事情,就是将.class文件加载到jvm中,不会执行static中的内容,只有在newInstance才会去执行static块. Class.forName(name,initialize,loader)带参数也可控制是否加载static块.并且只有调用了newI…
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…
Class类 首先,Class类里可以记载所有类的属性.方法等信息.这个也就是运行时类别标记,它记录了所有的对象(比如int,MyClass,void,数组等等)对应的类信息. Class对象 JVM对于每个所使用的对象,都会有相应的Class对象与之对应,要么这种类型的Class对象已经创建好了,要么就是要新创建一个Class对象. ClassLoader类 ClassLoader类负责的是加载一个类.也就是说,给定这个类相关的名字,定位到或者产生这个类相关的定义信息.ClassLoader对…
文章出处:http://blog.csdn.net/wikijava/article/details/5576043 Class的装载分了三个阶段,loading,linking和initializing,分别定义在The Java Language Specification的12.2,12.3和12.4. Class.forName(className)实际上是调用Class.forName(className, true, this.getClass().getClassLoader())…