Java类的加载过程和双亲委派机制

Java类的加载过程

。。。

双亲委派机制

 

Bootstrap classLoader:主要负责加载核心的类库(java.lang.*等),构造ExtClassLoader和APPClassLoader。

 

ExtClassLoader:主要负责加载jre/lib/ext目录下的一些扩展的jar。

 

AppClassLoader:主要负责加载应用程序的主函数类

什么是双亲委派机制?

   当类加载器收到类的加载请求时,会优先来到AppClassLoader(当有自定义加载器时,收到类加载请求也时从AppClassLoader开始),AppClassLoader加载器会查看ClassPath路径下的类包中是否已经加载过这个类(只有有到Bootstrap classLoader调用findClass()尝试加载),如果加载过就到此为止,反之会委托给父加载器(非继承式的父类关系)ExtClassLoader去进行加载,ExtClassLoader会进行AppclassLoader同样的操作,自己的目录中有就进行加载,没有就委托给父加载器Bootstrap classLoader,当到Bootstrap classLoader时不能再向上委托了,Bootstrap classLoader会使用findClass()方法进行加载,如果能就自己加载,不能就向下委托,直到AppClassLoader ,如果AppClassLoader 不能加载时就会抛出异常ClassNotFoundException。

为什么不直接从Bootstrap classLoader开始加载而是从AppClassLoader开始?

  AppClassLoader是加载程序员自己创建的类的加载器,而类加载请求中95%的请求都是来自于程序员自身创建的,当类加载请求最开始来到AppClassLoader时,AppClassLoader发现ClassPath路径下有这个类,这时就会直接进行加载,这样比先从AppClassLoader开始加载效率最高

为什么要设计这种机制?

  当有人去恶意替换系统级别的类时,比如在本地创建java.lang路径然后去创建String类,然后自己在类里面添加方法或者是使用main方法去调用是无法运行的,因为核心类库下的String中就没有main方法,类加载器不认识这个String 。核心类都被BootstrapclassLoader优先加载了,其他类加载没有机会去加载,所以避免了代码植入

 Java类的加载过程和双亲委派机制

 

Java类的加载过程和双亲委派机制

 

上一篇:Java类加载器


下一篇:《从JDK源码级别彻底剖析JVM类加载机制》