类加载器

Why image1
Bootstrap

让bootstrap加载自己写的jar包,1.放进lib 2.添加vm参数

image2

Extension : /jre/lib/ext

Application: classpath

image3

Extension:参数添加,要防止覆盖!!

双亲委派机制:谁来加载类

1.确保加载的安全

2.避免重复

执行: 向上传递,加载过直接返回.

都没加载过(ClassNotFound)遣返回去让他自己加载

注意此处的双亲是通过

聚合内置parent,

而不是extends

流程:

1.super.loadClass()

2.this.findClass()

3.this.defineClass()

4.this.resolveClass()

image5

===========

双亲委派机制总结:

打破双亲委派机制:

1.自定义加载类:让不同的加载器加载同一个类

(正常我们只重写findClass,但不重写loadClass)

直接findClass,而不去super.loadClass()

2.线程上下文类加载器

必须打破: 由于java需要操作数据库

因此将jdbc的驱动DriverManager放在核心库来记载.

它负责管理 JDBC 驱动的注册和连接操作。

这个其实并没有打破双亲委派机制:

JDBC 仍然需要走双亲委派机制本身的流程,

通过“上下文类加载器”这一后门机制,

绕过了双亲委派机制原本带来的“命名空间隔离”

继承abstract classLoader,会默认为其设置父类加载器为AppClassLoade

1.

image9

2.ShouldKnow第2点

热部署

-c是通过类加载器, 这样可以找到其加载过的类来解决mc重编译的类可能需要的依赖

image11

注意事项

JDK9及其以后的类加载器

image13

总结

image14