jvm类加载机制之类加载器
jvm类加载机制之类加载器(双亲委派模型)
虚拟机设计团队把加载动作放到JVM外部实现,以便让应用程序决定如何获取所需的类,JVM提供了3种类加载器:
启动类加载器(Bootstrap ClassLoader):负责加载 JAVA_HOME\lib 目录中的,或通过-Xbootclasspath参数指定路径中的,且被虚拟机认可(按文件名识别,如rt.jar)的类。
扩展类加载器(Extension ClassLoader):负责加载 JAVA_HOME\lib\ext 目录中的,或通过java.ext.dirs系统变量指定路径中的类库。
应用程序类加载器(Application ClassLoader):负责加载用户路径(classpath)上的类库。
JVM通过双亲委派模型进行类的加载,当然我们也可以通过继承java.lang.ClassLoader实现自定义的类加载器。
当一个类加载器收到类加载任务,会先交给其父类加载器去完成,因此最终加载任务都会传递到顶层的启动类加载器,只有当父类加载器无法完成加载任务时,才会尝试执行加载任务。
采用双亲委派的一个好处是比如加载位于rt.jar包中的类java.lang.Object,不管是哪个加载器加载这个类,最终都是委托给顶层的启动类加载器进行加载,这样就保证了使用不同的类加载器最终得到的都是同样一个Object对象。
在有些情境中可能会出现要我们自己来实现一个类加载器的需求,由于这里涉及的内容比较广泛,我想以后单独写一篇文章来讲述,不过这里我们还是稍微来看一下。我们直接看一下jdk中的ClassLoader的源码实现:
protected synchronized Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException { // First, check if the class has already been loaded Class c = findLoadedClass(name); if (c == null) { try { if (parent != null) { c = parent.loadClass(name, false); } else { c = findBootstrapClass0(name); } } catch (ClassNotFoundException e) { // If still not found, then invoke findClass in order // to find the class. c = findClass(name); } } if (resolve) { resolveClass(c); } return c; }
首先通过Class c = findLoadedClass(name);判断一个类是否已经被加载过。
如果没有被加载过执行if (c == null)中的程序,遵循双亲委派的模型,首先会通过递归从父加载器开始找,直到父类加载器是Bootstrap ClassLoader为止。
最后根据resolve的值,判断这个class是否需要解析。
而上面的findClass()的实现如下,直接抛出一个异常,并且方法是protected,很明显这是留给我们开发者自己去实现的,这里我们以后我们单独写一篇文章来讲一下如何重写findClass方法来实现我们自己的类加载器。
protected Class<?> findClass(String name) throws ClassNotFoundException { throw new ClassNotFoundException(name); }阅读更多
- jvm探秘九:类加载机制之类加载器
- 深入理解Java虚拟机——JVM类加载机制(类加载过程和类加载器)
- JVM类加载机制(类加载过程和类加载器)
- 《Java虚拟机原理图解》 JVM类加载器机制与类加载过程
- (二十七)JVM类加载器机制与类加载过程
- JVM类加载机制
- JVM(三):类加载机制(类加载过程和类加载器)
- JVM类加载机制
- 《深入理解JVM》--JVM类加载机制总结
- 【转】JVM 类加载机制(类加载过程和类加载器)
- 深入理解JVM之类的加载机制
- 类加载器的加载机制
- JVM类加载机制详解(二)类加载器与双亲委派模型
- Java JVM类加载机制原理
- JVM类加载机制
- JVM类加载机制(转)
- 深入类加载器-类加载器作用,类缓存、类加载器的层次结构、ClassLoader类介绍、代理模式之双亲委派机制
- jvm探秘八:类加载机制之类加载过程
- JVM类加载机制—加载的顺序问题
- JVM类加载机制详解(二)类加载器与双亲委派模型