Java虚拟机学习---ClassLoader的思考

为什么会有双亲委派模型?

    Java虚拟机在加载一个clas文件时,需要遵循一个流程,这个加载流程就是双亲委派模型,Java类加载器有三种:BootstrapClassLoader(启动类加载器)、ExtClassLoader(扩展类加载器)、AppClassLoader(应用程序加载器)。

                                              Java虚拟机学习---ClassLoader的思考_第1张图片

       Java加载class文件的过程是开放的,但需要保证基础核心的类不被修改,必然需要一套机制保证虚拟机的正常运行,这样的一套机制就是双亲委托模型,这里的双亲指的就是BootstrapClassLoader和ExtensionClassLoader,而委托则意味着,加载一个class文件的过程需要交给父ClassLoader去加载,找不到已加载的类时才会由子ClassLoader去加载,注意这里的父类并不是继承关系,而是指定了父类,实际上它们之间的关系是这样的:

                                这里写图片描述

         Bootstrap ClassLoader是由C/C++编写的,它本身是虚拟机的一部分,所以它并不是一个Java类,为什么不跟AppClassLoader和ExtClassLoader一样写成Java形式呢,个人觉得是为了防止被hook,也就是无法在java代码中获取它的引用,JVM启动时通过Bootstrap类加载器加载rt.jar等核心jar包中的class文件,之前的int.class,String.class都是由它加载。   

可以加载一个自定义的路径一样且同名的Java.lang.Object么?

       不可以。

       java.xxx开头的类属于Java语言的基础类,由BootstrapClassLoader去加载,ApplicationClassLoader继承自URLClassLoader,在URLClassLoader的findClass()方法里会检测文件名,如果文件名以"java."开头,会抛出SecurityException。

自定义ClassLoader中findClass()与loadClass()有什么区别?

     ClassLoader在Java 1.0版本中就已出现,当时用户继承ClassLoader的唯一目的就是重写loadClass()方法,双亲委托模型是在Java1.2版本引入的,为了兼容之前的版本,新添加了一个findClass()方法,在1.2版本之后,loadClass()方法也会调用到findClass()方法,所以1.2版本以后建议复写findClass()方法。

你可能感兴趣的:(java)