1.什么是类加载
类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个 java.lang.Class
对象,用来封装类在方法区内的数据结构。类的加载的最终产品是位于堆区中的 Class
对象, Class
对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口。
2.类生命周期
加载、验证、准备、解析、初始
3.类加载器
1、BootstrapClassLoader 启动类加载器
2、ExtensionClassLoade 扩展类加载器
3、ApplicationClassLoader 应用程序加载器
4.类加载方式
1、命令行启动应用时候由JVM初始化加载
2、通过Class.forName()方法动态加载
3、通过ClassLoader.loadClass()方法动态加载
5.双亲委派机制
1、当 AppClassLoader
加载一个class时,它首先不会自己去尝试加载这个类,而是把类加载请求委派给父类加载器ExtClassLoader
去完成。
2、当 ExtClassLoader
加载一个class时,它首先也不会自己去尝试加载这个类,而是把类加载请求委派给BootStrapClassLoader```去完成。
3、如果 BootStrapClassLoader
加载失败(例如在 $JAVA_HOME/jre/lib
里未查找到该class),会使用 ExtClassLoader
来尝试加载
4、若ExtClassLoader也加载失败,则会使用 AppClassLoader
来加载,如果 AppClassLoader
也加载失败,则会报出异常 ClassNotFoundException
。