类加载的几种方式

概念

类加载器(ClassLoader),顾名思义,即加载类的东西。在我们使用一个类之前,JVM需要先将该类的字节码文件(.class文件)从磁盘、网络或其他来源加载到内存中,并对字节码进行解析生成对应的Class对象,这就是类加载器的功能。我们可以利用类加载器,实现类的动态加载。

Class的装载包括3个步骤:加载(loading),连接(link),初始化(initialize)
加载:查询并加载类的二进制数据.class
连接:1)、验证:确保被加载的类的正确性;
     2)、准备:为类的静态变量分配内存,并将其初始化为默认值;
     3)、解析:把类中的符号引用转化为直接引用
初始化:为类的静态变量赋予正确的初始值
类加载的方式有几种?区别是什么?
加载方式:
1、由new关键字创建一个类的实例
    在由运行时刻用 new 方法载入
    例:Person person = new Person();
2、使用Class.forName()
    通过反射加载类型,并创建对象实例
    例:Class clazz = Class.forName("Person");
        Object person =clazz.newInstance();
3、使用某个ClassLoader实例的loadClass()方法
    通过该 ClassLoader 实例的 loadClass() 方法载入。应用程序可以通过继承 ClassLoader 实现自己的类装载器。
    例:Class clazz = classLoader.loadClass("Person");
        Object person =clazz.newInstance();
区别:

1和2使用的类加载器是相同的,都是当前类加载器(即:this.getClass.getClassLoader)。
3由用户指定类加载器。如果需要在当前类路径以外寻找类,则只能采用第3种方式。即第3种方式加载的类与当前类分属不同的命名空间。

1是静态加载,2、3是动态加载

异常(exception)

静态加载的时候如果在运行环境中找不到要初始化的类,抛出的是NoClassDefFoundError,它在JAVA的异常体系中是一个Error;
动态态加载的时候如果在运行环境中找不到要初始化的类,抛出的是ClassNotFoundException,它在JAVA的异常体系中是一个checked异常。

从JVM的角度看,我们使用关键字new创建一个类的时候,这个类可以没有被加载。但是使用Class对象的newInstance()方法的时候,就必须保证:1.这个类已经加载;2.这个类已经连接了。

new关键字和newInstance()方法的区别:
newInstance:弱类型,低效率,只能调用无参构造;
new:强类型,相对高效,能调用任何Public构造。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章