从萌新的角度理解Java类加载机制

类加载机制

本文主要是对java中类加载机制的入门级别文章,主要介绍类加载机制基本概念,以及类加载机制主要内容。本文按照结构组织如下:

  • 类加载机制是什么
  • 类加载机制主要内容

一丶类加载机制什么?

java程序从静态文本到动态执行的过程

    java中的类加载机制,从字面意思就不难理解。就是描述class文件加载到jvm的主要过程,class文件是对java类的描述,加载java类的过程就是加载class文件的过程。
    类加载机制是围绕ClassLoader这个核心类展开的,classLoader就是类加载机制中的核心类。classLoader有如下几个主要的方法:
classLoader的核心方法.png

  • defineClass:是将字节码加载到JVM内存中,解析成Class对象的方法。
  • findClass: 该方式解析指定路径下的class文件生成Class对象的方法。一般defineClass方法和findClass是组合使用的,在findClass方法中依据指定路径,获取字节流,然后代用defineClass方法进行解析。
  • resolveClass:解析继承关系上的的父类,以及所引用的类,是一个递归解析的过程,在对象正真被实例化的时候,该方法被调用。
  • loadClass:该方法是上述所有方法的一站式解决方案,也是JVM自带类加载机制。如果调用loadClass方法加载类,是按照JVM默认的规则加载类,如果需要定制类加载器,则通过重写上述的三个方法可以达到效果
    二丶类加载记住的主要内容

1. 谁来负责class文件的加载

在java代码中,每个定义的类都是由classloader加载进来的。JVM中的类加载器之间的关系组织结构和类的继承关系有些相似,都是一层层的,一个类加载器有父加载器,父加载器下面有许多子加载器。JVM主要提供三层类加载器:

1.1 类加载器组织结构

  • 第一层:Bootstrap ClassLoader,这个类加载器,主要复杂加载JVM自身工作所需要的类。其他人都访问不到这个类加载器,是一个相对独立的类加载,其上没有父加载器,也没有子加载器
  • 第二层:ExtClassLoader,这类加载是应用层能够访问到的顶层类加载器,可以认为其没有父加载器,只有子加载器。其主要负责加System.getProperty("java.ext.dirs")目录下的类。
    -第三层:AppClassLoader,这个类加载器就是我们最常接触的类加载器,用来接在classpath路径下类的加载器。其父加载器是ExtClassLoader.
    特别注意,从逻辑上可以定义第四层类加载器:
  • 第四层:自定义classLoader,该层不是JVM自带的类加载器,而是我们自定义的类加载器,在整个类加载的组织结构中,可以理解为第四层,其父加载器是AppClassLoader.
    类加载器的组织结构
    在熟悉类加载器组织结构后,我们还不能回答究竟是谁负责加载java类。在介绍完上级委托加载机制(双亲委托加载机制)后,就可以从众多classLoader中找到合适的类加载器加载java类了。

1.2 上级委托加载机制

上级委托加载机制

图中的类加载器1是类加载器2的父加载器,从上往下依次类推。

  • 向上询问:当我们使用类加载器4加载目标对象时,并不一定是类加载器4来负责该类的加载,类加载器4在确保目标类未被加载后,会将加载请求传递给其父加载器classloader3。classloader3会继续重复和classloader4相同的工作,向其父加载器传递加载请求,加载请求最后被传递给顶层加载器classloader1.。在该过程中如果某层加载器发现该类已加载了,则结束加载过程,确保不重复加载。如果顶层加载机制受理了加载请求,此次加载过程就结束了。**这个过程,
  • 向下委派 如果顶层加载机制不受理该次加载请求,其会将类加载请求按原路遣返,沿途加载器将会依次检查是否受理该次类加载请求,最后由受理加载器加载目标类。

二丶类加载过程

上级委托机制回答了是谁负责加载类的这个问题,阅读完这一节后,就可以回答JVM加载类的一般过程了。


JVM加载类的阶段
  • 第一阶段:该阶段的主要工作是定义去哪儿找class文件,并且通过字节流的形式将class文件加载到内存中。
  • 第二阶段:该阶段细分为三个小阶段
    1. 字节码验证:类加载对加载的字节码,要做许多验证,确保class文件格式正确,行为正确。
    2. 类准备:在该阶段准备描述类中字段,方法以及实现接口所需要的数据结构,
    3. 解析:在这个阶段类加载器会将类中引用的所有相关类都加载进去,并且这是一个递归的过程。
  • 第三阶段:初始化class对象,在这个阶段静态变量将初始化,静态代码块也是在这个时候执行的。

三丶定制类加载器

了解类加载机制的基本原理后,我们可以看看类加载机制在实际开发中的一些用途

  • 在自定义路径下查找class类文件,当我们需要的class文件,不是在classpath路径下时,就需要自己实现一个类加载器来加载指定路径下的class文件。
  • 对要加载的类做特殊的处理,在网络传输类信息时,一般会对类的字节码加密。在加载到JVM之前需要对类的字节码解密后再按传统方法加载,这个过程就可以通过自定义类加载器实现
  • 类加载器一个比较常见的应用就是热部署,检查到已经加载的class文件已经修改的时候,重新加载这个类,以实现热部署。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,444评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,421评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,363评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,460评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,502评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,511评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,280评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,736评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,014评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,190评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,848评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,531评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,159评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,411评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,067评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,078评论 2 352

推荐阅读更多精彩内容