类加载器

Why 930570f748effa55c65a3a65d9d94c5abb83214d
Bootstrap

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

d6f7d32accc2e43b85bf6456fc4b1080ed16d81c

Extension : /jre/lib/ext

Application: classpath

924fcd439574165cb87f230742b2c29bc018d7c8

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

5ab13d994b1828d980374303de063f408d1f70db

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

1.确保加载的安全

2.避免重复

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

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

注意此处的双亲是通过

聚合内置parent,

而不是extends

流程:

1.super.loadClass()

2.this.findClass()

3.this.defineClass()

4.this.resolveClass()

f419df99229462b932641eda6cd0d8eedf28a749

32572b20ae4f3211e16863d54c4148d91a4eadbe

===========

a3b4d5a3e00fab8976824cd3b3b9fdf69a0e18a4

双亲委派机制总结:

c315e91773a776522ff34e06523ef1e7cdbdd5c2

打破双亲委派机制:

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

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

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

2.线程上下文类加载器

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

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

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

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

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

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

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

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

1.

c003e9f65294525e0860ba1142fc159b92d3c24f

2.ShouldKnow第2点

07d2a4fbb0617d94ce05fd7ed3cd2e2c1fc840c8

热部署

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

e0c1e47d62bfdb0fba603c351ed7b99fc1d721e4

注意事项

2c27bb00bacce7eec7f47cced1eda9cd959e04d2

JDK9及其以后的类加载器

56df4b6a48643ab982f7726cd26589ad9f1785fc

总结

c8b48ddfc21d6725a6891b0f3f5c6f8ecb93a7af