类装载器的工作机制

类装载器就是寻找类的字节码文件并构造出类在JVM内部表示对象的组件。在Java中,类装载器把一个类装入JVM中,需要经过以下步骤:

  1. 装载:查找和导入Class文件。
  2. 链接:执行校验、准备和解析步骤,其中解析步骤是可以选择的。
    1. 校验:检查载入Class文件数据的正确性。
    2. 准备:给类的静态变量分配存储空间。
    3. 解析:将符号引用转换成直接引用。
  3. 初始化:对类的静态变量、静态代码块执行初始化工作。
    类装载工作由ClassLoader及其子类负责。ClassLoader是一个重要的Java运行时系统组件,它负责在运行时查找和装入Class字节码文件,JVM在运行会产生3个ClassLoader:根装载器、ExtClassLoader(扩展类装载器)和AppClassLoader(应用类装载器)。其中,根装载不是ClassLoader的子类,它使用C++语言编写,因而在Java中看不到它,根装载器负责装载JRE的核心类库,如JRE目标下的rt.jar、charsets.jar等。ExtClassLoader和AppClassLoader都是ClassLoader的子类,其中ExtClassLoader负责装载JRE扩展目录ext中的JAR类包;AppClassLoader负责装载Classpath路径下的类包。

这3个类装载器之间存在父子层级关系,即根装载器是ExtClassLoader的父装载器,ExtClassLoader是AppClassLoaderde父装载器。在默认情况下,使用AppClassLoader装载应用程序的类。

JVM装在类时使用"全盘负责委托机制","全盘负责"是指当一个ClassLoader装载一个类时,除非显式地使用另一个ClassLoader,该类所依赖及引用也由这个ClassLoader载入;"委托机制"是指先委托父装载器寻找目标类,只有在找不到的情况下才从自己的类路径下查找并装载目标类。这一点是从安全角度考虑的。

ClassLoader的重要方法

在Java中,ClassLoader是一个抽象类,位于java.lang包中。下面对该类的一些重要接口方法进行介绍。

  • Class loadClass(String name): name参数指定类装载器需要装载类的名字,必须使用全限定类名。该方面有一个重载方法loadClass(String name,boolean resolve),resolve参数告诉装载器是否需要解析该类,在初始化类之前,应考虑进行类解析的工作,但并不是所有的类都需要解析该类。如果JVM只需要知道该类是否存在或找出该类的超类,那么就不需要进行解析。
  • Class definClass(String name,byte[] b,int off,int len): 将类文件的字节数组转换成JVM内部的java.lang.Class对象,字节数组可以从本地文件系统、远程网络获取。参数name为字节数组对应的全限定类名。
  • Class findSystemClass(String name):从本地文件系统载入Class文件。如果本地文件系统不存在该Class文件,则将抛出ClassNotFoundException异常,该方法是JVM默认使用的装载机制。
  • CLass findLoadedClass(String name): 调用该方法来查看ClassLoader是否已经装入某个类。如果已装入,那么返回java.lang.Class对象;否则返回null,如果强行装载已存在的类,那么将会抛出链接错误。
  • ClassLoader getParent():获取类装载器的父装载器。除根装载器外,所有的类装载器有且仅有一个父装载器。ExtClassLoader的父装载器是根装载器,因为根装载器非Java语言编写,所以无法获得,将返回null。

类装载器-ClassLoader的更多相关文章

  1. 类装载器ClassLoader

    类装载器工作机制 类装载器就是寻找类的节码文件并构造出类在JVM内部表示对象的组件.在Java中,类装载器把一个类装入JVM中,要经过以下步骤: [1.]装载:查找和导入Class文件: [2.]链接 ...

  2. Java类装载器ClassLoader

    类装载器工作机制 类装载器就是寻找类的节码文件并构造出类在JVM内部表示对象的组件.在Java中,类装载器把一个类装入JVM中,要经过以下步骤: [1.]装载:查找和导入Class文件: [2.]链接 ...

  3. 深度分析 Java 的 ClassLoader 机制(源码级别)

    写在前面:Java中的所有类,必须被装载到jvm中才能运行,这个装载工作是由jvm中的类装载器完成的,类装载器所做的工作实质是把类文件从硬盘读取到内存中,JVM在加载类的时候,都是通过ClassLoa ...

  4. 深度分析Java的ClassLoader机制(源码级别)

    写在前面:Java中的所有类,必须被装载到jvm中才能运行,这个装载工作是由jvm中的类装载器完成的,类装载器所做的工作实质是把类文件从硬盘读取到内存中,JVM在加载类的时候,都是通过ClassLoa ...

  5. 深度分析 Java 的 ClassLoader 机制(源码级别)(转)

    写在前面:Java中的所有类,必须被装载到jvm中才能运行,这个装载工作是由jvm中的类装载器完成的,类装载器所做的工作实质是把类文件从硬盘读取到内存中,JVM在加载类的时候,都是通过ClassLoa ...

  6. java 反射 类装载器

    前言: java语言允许通过程序化的方式间接对Class进行操作,Class文件由类装载器装载后,在jvm中将形成一份描述Class结构的元信息对象,通过该元信息对象可以获知Class的结构信息,如构 ...

  7. 【JVM】深度分析Java的ClassLoader机制(源码级别)

    原文:深度分析Java的ClassLoader机制(源码级别) 为了更好的理解类的加载机制,我们来深入研究一下ClassLoader和他的loadClass()方法. 源码分析 public abst ...

  8. 理解不为人知的ClassLoader

    JAVA类装载方式,有两种: 1.隐式装载, 程序在运行过程中当碰到通过new 等方式生成对象时,隐式调用类装载器加载对应的类到jvm中. 2.显式装载, 通过class.forname()等方法,显 ...

  9. Servlet学习(二):ServletConfig获取参数;ServletContext应用:请求转发,参数获取,资源读取;类装载器读取文件

    转载:http://www.cnblogs.com/xdp-gacl/p/3763559.html 一.ServletConfig讲解 1.1.配置Servlet初始化参数 在Servlet的配置文件 ...

随机推荐

  1. 【API知识】MongoTemplate非映射方式操作Document

    前言 我是MongoDB小白,刚开始学.不过,我猜大多数使用MongoDB的,都是采用映射方式处理的,即需要有定义好的用于映射的实体类.但是这样的话,如果表的结构在未来可能频繁变动,增删字段,甚至添加 ...

  2. NIO Channel和Buffer

    Java NIO 由以下几个核心部分组成: Buffer Channel Selector 传统的IO操作面向数据流,意味着每次从流中读一个或多个字节,直至完成,数据没有被缓存在任何地方.NIO操作面 ...

  3. 了解Job和JobDeatil ,JobDataMap (三)

    一:定义 Job:实现任务逻辑的接口. JobDeatil:JobDeatil为Job提供了许多设置属性,以及JobDataMap成员变量属性,他用来储存特定的Job实例状态信息,调度器需要使用Job ...

  4. 自己写的thinkphp自动生成类

    模型类:CqhModel.class.php <?php namespace Cqh\Model; use Think\Model; class CqhModel extends Model { ...

  5. linux下将指定目录加入环境变量的方法

    每个用户目录下都有一个对应的.bash_profile比如root用户对应/root/.bash_profile,普通用户cqh对应/home/cqh/.bash_profile,以root用户为例v ...

  6. Python vtk学习(1)

    Vtk,(visualization toolkit)是一个开源的免费软件系统,主要用于三维计算机图形学.图像处理和可视化.Vtk是在面向对象原理的基础上设计和实现的,它的内核是用C++构建的,包含有 ...

  7. www.jqhtml.com 前端框架特效

    www.jqhtml.com * 请选择课程 初级班 (PS.HTML.CSS.静态网站项目实战) 中级班 JavaScript基础.JavaScript DOM.jQuery.JS进阶.HTML5和 ...

  8. MVC四大筛选器—ActionFilter&ResultedFilter

    AuthorizeFilter筛选器 在Action的执行中包括两个重要的部分,一个是Action方法本身逻辑代码的执行,第二个就是Action方法的筛选器的执行. MVC4中筛选器都是以AOP(面向 ...

  9. java_单词长度

    题目内容: 你的程序要读入一行文本,其中以空格分隔为若干个单词,以‘.’结束.你要输出这行文本中每个单词的长度.这里的单词与语言无关,可以包括各种符号,比如“it's”算一个单词,长度为4.注意,行中 ...

  10. Paired t-test

    1 Continuous Dependent Variable with normal distribution 1 (2 Level) Categorical Independent Variabl ...