类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个 java.lang.Class对象,用来封装类在方法区内的数据结构。
类的加载
-
Java文件通过编译成.class文件后,通过类加载器再加载到JVM中。
-
类加载七个过程:加载、验证、准备、解析、初始化、使用、卸载
三种类加载器
Bootstrap ClassLoader(启动类加载器) > Extention ClassLoader(拓展类加载器) > Appclass Loader(应用程序类加载器)
类加载的三种方式
- 通过命令行启动应用时由JVM初始化加载含有main()方法的主类。
- 通过Class.forName()方法动态加载,会默认执行初始化块(static{}),但是Class.forName(name,initialize,loader)中的initialze可指定是否要执行初始化块。
- 通过**ClassLoader.loadClass()**方法动态加载,不会执行初始化块。
自定义类加载器
-
遵守双亲委派模型:继承ClassLoader,重写findClass()方法。
-
破坏双亲委派模型:继承ClassLoader,重写loadClass()方法。
-
通常我们推荐采用第一种方法自定义类加载器,最大程度上的遵守双亲委派模型。
-
实现步骤
(1)创建一个类继承ClassLoader抽象类
(2)重写findClass()方法
(3)在findClass()方法中调用defineClass()