双亲委派机制

92 阅读2分钟

上篇说类加载的阶段中,说到类加载的第一个阶段是加载,将类的class文件信息加载到方法区中,那问题来了,通过什么加载的呢。毫无疑问嘛,类加载器。那类加载器只有一个吗,肯定不是啦。那这么多类加载器选择哪一个呢。这时就需要利用双亲委派机制来进行对类加载器的正确选择了。下面大致进行讲讲。

**定义:**当一个类要进行加载操作时,某一个类加载器会收到类加载的请求,但是这个类加载器并不会直接进行类的加载,他会把这个加载请求委派给自己的上级(首先清楚,这里的几个类加载器并不是继承关系,也就不是父类子类的关系。只能说是上下级关系),依次类推。当把加载请求委派到最上级的时候,此时才开始进行加载操作,当加载失败时,又会将加载请求下放给下级,以此类推。最后加载不成功,将会报classnotfond异常。

classLoader(类加载器的主要几个):

  • Bootstrap ClassLoader(启动类加载器):主要负责加载Java核心类库,%JRE_HOME%\lib下的rt.jar、resources.jar、charsets.jar和class等
  • Extention ClassLoader(扩展类加载器):主要负责加载目录%JRE_HOME%\lib\ext目录下的jar包和class文件
  • Application ClassLoader(应用程序类加载器) :主要负责加载当前应用的classpath下的所有类(也就是我们自己写的类)
  • User ClassLoader(用户自定义类加载器) :用户自定义的类加载器,可加载指定路径的class文件

关系图:

了解了其运行机制,那现在就说说好处和坏处。

优点:

1.不会让类重复的加载,当上级类加载器加载后,其下的类加载器就不会再进行加载了。

2.保证了类的安全性。比如无论是String 类还是Integer还是其他jdk自带的类,他们都是通过Bootstrap ClassLoader类加载器进行加载的,因为他们是在JAVA_HOME中的jar包里面的类。这时如果在项目中自定义了一个String类,还是Integer类。这时还是会加载jar包中的类,不会加载自定义的类。

本文使用 文章同步助手 同步