ClassLoader 是如何查找资源的

ClassLoader作用

?classloader这个写业务代码的童鞋们,应该很少用到,但是写框架的应该很熟悉。这个类负责Java底层的类的加载和查找,简单滴说Java 的所有类都是由它负责将class文件加载到JVM

? ? 这篇文章主要是讲解,ClassLoader是如何查找和加载类的

常用的ClassLoader

??①:BootStrapClassloader? 负责加载jre下面的核心类

? ?②:ExtClassLoader? ? ? 负责加载jre/ext下面的类

? ?③:AppClassloader? ? ? 负责加载classpath下面的类或者jar,这个classpath很广,包括(我们平常能接触到也就是这个AppClassload)

? ? ? ? ? ? ? ? ? ? ?①:jre/lib下面的部分包

? ? ? ? ? ? ? ? ? ? ?②:web项目的classpath路径下的所有的类和资源

? ? ? ? ? ? ? ? ? ? ?③:web项目依赖的第三方jar包

? ?④:自定义classloader

? ?如果有兴趣的话,你们可以分别打印出每个classloader管理的资源,代码如下


ClassLoader如何发现资源? ?

这段是基础介绍,如果大家知道可以跳过

一,各个Classloader的关系直接上图(双亲委托机制)


? ? ? ? ?? ?查找一个.class文件时,从上图可以看到,

? ? ? ? ? ? ①:查找资源的时候appClassloader会将查找任务先委托给自己的上级ExtClassloader

? ? ? ? ? ? ②:ExtClassloader会将查找任务先委托给上级BootStrapClassloader

? ? ? ? ? ? ③:只有在上级查找不到情况下,自己再负责查找资源并加载

? ? ? ? ? ? 经典加载代码?Thread.currentThread().getContextClassLoader().loadClass("");


这段是基础介绍,如果大家知道可以跳过

问题

? ? 问题1:每个classloader 管理的资源存储在什么地方

? ? 问题2:项目依赖的jar包本身还要依赖第三jar包,此时classloader又该如何处理

示例

main方法执行后,JVM是如何加载main方法所在的类

? ? ? 首先大家要知道JVM是不会傻傻的在启动时候,直接将程序中所有的类和资源都加载进内存,JVM秉承的设计原则就是,用时再加载,不用的时候,你就歇着吧(JVM作为BOSS 很抠的哈),那么JVM是怎么加载main方法所在的类尼

? ? ? ①:程序启动的时候,JVM负责先装载所有的classLoader(这一部分,大家不用深究,具体JVM怎么下指令的,这个东西是底层做的,我们也看不懂),我们只需要知道JVM帮忙实例化了sun.misc.Launcher这个类,在这个构造函数中

,装载所有的Classloader(主意:BootstrapClassloader不归它管,你可以理解BootstrapClassloader为JVM直辖(就像直辖市一样))

②:加载main方法所在的类如:A,调用的部分流程如下:最终调用Classloader.loadClass这个方法加载A类,这个类(典型的双亲委托模式实例)


? ? ? ??? ?③:带着问题分析一下ClassLoader.loadClass 这个类

从上文得知findClass()这个方法是具体负责加载资源,但是你点击进去会发现这是一个为空实现,看看这个类的继承关系,AppClassLoader父类为URLClassLoader,我们到URLclassLoader上看看

其实到这里,我们已经可以看到,其实是类查找和加载UCP?这个对象操作,UCP(是URLClasspath这个类的实例)

??ps:这里的涉及到缓存的代码,暂时不要看(如:getLookUpCache()),基本上都无法名中(反正我debug的时候,没啥用)

重点来啦,要看懂上述这段代码,就不的不提一下上面讲的那个类URLClassPath 和URLClassPath.loader这个内部类

path:初始化类加载器的时候,设置类记载器管理的默认资源列表(比如appclassLoader 这个类加载器,这个path中主要存储的是项目依赖的jar包路径(不包括此ar包依赖的第三方jar),jre/lib下的部分jar)

urls:其实初始化完成以后应该和path一样,区别在于urls还会解决这个问题(问题2:项目依赖的jar包本身还要依赖第三jar包,此时classloader又该如何处理),

也就是说,urls初始化完成以后,还会去加载jar包依赖的第三方jar包,怎么加载的(下面分析)(这是一个栈的数据结构,先进后出)

loaders:这个属性有点强啦,是资源抽象(URLClassPath.loader)的列表,提供一个非常关键的方法? Resource getResource(String var1, boolean var2) ,负责匹配资源(或者说在这个资源中能不能找到这个要加载的类)

? ? ? ? ? ? ? ?URLClassPath.loader? 有2个具体的实现类,每个都重写了getResource这个方法

lamp 这个其实作用不是很大,做一个缓存的作用,如果URLClassPath.loader实例化过啦,直接从缓存中取出,不用重新实例化啦

那么我们现在再来分析一下,getLoader这个方法

给大家画了一张简单时序图


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

推荐阅读更多精彩内容