6、类加载器深入解析与重要特性剖析

6.1、类加载器介绍

  类加载器用来把类加载到java虚拟机中。从JDK1.2版本开始,类的加载过程采用“双亲委托机制”,这种机制能更好的保证java平台的安全。在“双亲委托机制”中,除了java虚拟机自带的根类加载器外,其余的类加载器都有且只有一个父加载器。双亲委托机制将在下章介绍。

6.2、类加载器分类

有两种类型的类加载器:

  • java虚拟机自带的类加载器
  • 根类加载器(Bootstrap)
    • 该加载器没有父加载器,它负责加载虚拟机的核心类库,如java.lang.*等。根类加载器从系统属性sun.boot.class.path所指定的目录中加载类库。根类加载器的实现依赖底层操作系统,属于虚拟机实现的一部分,没有继承java.lang.ClassLoader类。
  • 扩展类加载器(Extension)
    • 它的父加载器为根类加载器。它从java.ext.dirs系统属性所指定的目录中加载类库,或者从JDK的安装目录的jre\lib\ext子目录(扩展目录)下加载类库,如果把用户创建的jar文件放在这个目录下,也会自动由扩展类加载器加载。扩展类加载器是纯java类,是java.lang.ClassLoader类的子类。
  • 系统(应用)类加载器(System)
    • 也称为应用类加载器,它的父加载器为扩展类加载器。它从环境变量classpath或者系统属性java.class.path所指定的目录中加载类,它是用户自定义的类加载器的默认父加载器。系统类加载器是纯java类,是java.lang.ClassLoader类的子类。
  • 用户自定义的类加载器
  • java.lang.ClassLoader的子类
  • 用户可以定制类的加载方式,java提供了抽象类java.lang.ClassLoader,所有用户自定义的类加载器都应该继承该类

6.3、类的加载时机

  类加载器并不需要等到某个类被程序“首次主动使用”时再加载它。

  JVM规范允许类加载器在预料某个类将要被使用时就预先加载它,如果在预先加载的过程中遇到了.class文件缺失或存在错误,类加载器必须在“程序首次主动使用”时才报告错误(LinkageError错误),如果这个类一直没有被程序主动使用,那么类加载器就不会报告错误。

  点击查看【java程序对类主动使用的7种情况

6.4、类的加载

  类的加载指的是将类的class文件中的二进制数据读入到内存中,并将其放置在运行时数据区的方法区内,然后在内存中创建一个java.lang.Class对象。Class对象封装了类在方法区内的数据结构,并且向java程序员提供了访问方法区内的数据结构的接口。

猜你喜欢

转载自www.cnblogs.com/sunhao1234/p/12334089.html