ClassLoader载入层次

深藏阁楼爱情的钟 2022-07-14 11:38 232阅读 0赞

Class.forName(classname)默认是用调用 ClassLoader.getCallerClassLoader()这个方法来获得调用者类的加载器,而调用者的类加载器再利用classLoader的委托模型去加载。其实每次new一个类的时候,也是通过 ClassLoader.getCallerClassLoader()去获得调用者类的加载器来加载的。
  Java中的类加载器可以分为四类:
  
  1 Bootstrp loader
  Bootstrp加载器是用C++语言写的,它是在Java虚拟机启动后初始化的,它主要负责加载%JAVA_HOME%/jre/lib以及%JAVA_HOME%/jre/classes中的类,并且它也会加载ExtclassLoader类。
  
  2 ExtClassLoader
  Bootstrp loader加载ExtClassLoader,并且将ExtClassLoader的父加载器设置为Bootstrp loader.当时因为bootstrp loader不是JAVA写的,所以占在JAVA的角度来看,调用Extclassloader的getParent()返回的是null.ExtClassLoader主要加载%JAVA_HOME%/jre/lib/ext中的jar文档,以及此路径下的所有classes目录。
  
  3 AppClassLoader
  Bootstrp loader加载完ExtClassLoader后,就会加载AppClassLoader,并且将AppClassLoader的父加载器指定为ExtClassLoader。AppClassLoader主要负责加载classpath所指定的位置的类或者是jar文档。
  
  4 URLClassLoader
  URLClassLoader是我们可以自定义的加载器,我们可以通过指定一个URL对象来创建此加载器,它所加载路径就是URL所代表的逻辑位置。并且它的父加载器是AppClassLoader。
  
  有了这个加载器的继承体系以后,就可以清楚的知道委托模型是怎么实现的了,当一个加载器要加载一个类的时候,首先请求父加载器来加载,父加载器再请求父加载器来加载,依此类推,如果所有的父加载器都不能加载,那么才有自己加载,如果也不能加载,则出现NoClassDefFoundError错误.所以打包的时候,其实是将自己的类放在规定的地方,让框架已经实现的类加载器来加载,这样以来,就可以让框架来管理自己些的类的生命周期。在一般的情况下,我们自己写的类,默认都是由AppclassLoader来载入的,只要class的全名不和AppclassLoader的父加载器已经加载的类相同就OK。

本文转载自:ClassLoader载入层次

发表评论

表情:
评论列表 (有 0 条评论,232人围观)

还没有评论,来说两句吧...

相关阅读

    相关 ClassLoader解惑

     ClassLoader解惑 一、什么是Classloader 一个Java程序要想运行起来,首先需要经过编译生成 .class文件,然后创建一个运行环境(j

    相关 载入XML

    一 介绍 XML文档创建成功后,要对XML文档中的内容进行操作,就必须考虑如何载入XML文档。 要载入XML文档,可以通过DOM对象来完成。 DOM的全称是Documen

    相关 ClassLoader

    ClassLoader主要对类的请求提供服务,当JVM需要某类时,它根据名称向ClassLoader要求这个类,然后由ClassLoader返回 这个类的class对象。 1.

    相关 ClassLoader

    类加载器,功能是负责读取Java字节码代码(.class文件),并转换成java.lang.Class类的一个实例(每个实例代表一个Java类)并加载到JVM中。 是抽象类

    相关 ClassLoader

    获取classpath下的资源文件 先调用当前线程的context加载器的getResourceAsStream方法去获取 没找到,在调用当前传入类的类加载器的getR

    相关 classloader

    ClassLoader应该是每一个Java程序员都必须了解的,但是我整整工作了四年才发现原来在这方面全是空白,现在在做模块化,必须得了解这方面的知识,模块间