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