1. 作用
加载 Java 类的字节码( .class
文件)到 JVM 中(在内存中生成一个代表该类的 Class
对象)
2. 加载规则
- 不会一次性加载所有的类,而是根据需要去动态加载,对内存更加友好
- 已经加载的类会被放在
ClassLoader
中,相同二进制名称的类只会被加载一次
3.类加载器
4.双亲委派模型
在双亲委派模型中,每个类加载器都有一个父加载器,并且加载器之间的关系是组合的。
执行流程:
判断当前类是否被加载过-》加载请求委派给父类加载器去完成,最终都会传送到顶层的启动类加载器 BootstrapClassLoader
-》父类加载器无法完成加载,则由子加载器加载,子加载器无法加载时抛出异常
5.相同的类
全类名与类加载器均相同
6. 双亲委派模型作用
- 避免类的重复加载
- 保证了 Java 的核心 API 不被篡改
7.如何打破双亲委派机制?
无法被父类加载器加载的类最终会通过 findClass()
方法被加载。如果自定义类加载器若不想打破双亲委派模型,就重写 ClassLoader
类中的 findClass()
方法。如果想打破双亲委派模型则需要重写 loadClass()
方法,就可以改变加载类的执行流程。
8. 如何逆向加载类?
当前类可以不使用自己的类加载器,而是用当前线程的上下文类加载器。它允许在运行时动态地切换类加载器。