-
先在当前加载器的缓存中查找有无目标类,如果有,直接返回。
-
判断当前加载器的父加载器是否为空,如果不为空则交由父类加载(父类递归进入第一步的操作)
-
反之,如果当前加载器的父类为空,则交给最顶级的BootstrapClassLoader类来加载
-
如果以上三步都无法加载,则从上往下挨个加载。如果还是无法加载,则抛出ClassNotFoundException
双亲委派机制有两个好处 首先可以保证所有类只加载一次,其次,如果用户编写了一个和核心类库同名的类,比如Object。双亲委派机制加载则可以保证该类永远由启动加载器BootstrapClassLoader加载,而该类只会加载jdk里自带的Object。自写得类永远只能被编译 但无法被加载
破坏: 如果自己定义一个类加载器 并从重写loadClass方法,舍弃第二步和第三步,来加载核心类库是否可行?
不可以,JDK为核心类库提供了一层保护机制。不管是自定义的类加载器还是系统类加载器 抑或是扩展类加载器,最终都必须调用java.lang.ClassLoader.defineClass()方法,而该方法会执行perDefineClass()接口。该接口提供了对JDK核心类库的保护
如果加载的类全限定名为java.开头,则可以判定需要加载的为jdk核心类库,那就会直接抛出异常
不和别人一样,不复制只真正理解