java之classLoader

从一个场景谈起: 代码里面用到Thread临时改变ContextClassLoader, 加载类之后,再设置回来的例子。所以研究一下ClassLoader.

基础: 

三个ClassLoader:  Bootstrap, Ext,App. 

bootstrap用来加载java核心类,都放jre/lib里面;Ext用来加载扩展类,在ext文件夹里面;App用来加载classpath下面的类。这正好可以和配置java环境的时候的路径配置对应。

key1: 三者没有物理上的父子关系,只是逻辑上的。也就是parent只是classLoader的一个字段, 是设置的。而bootstrap都不是ext逻辑上的parent,只是功能上的。app和ext设置parent构造函数里面,而调用(传入parent)在Launcher里面。

key2: 类关系

app,ext ----->UrlClassLoader------->secureClassLoader---->classLoader, 各个环节的作用根据名字可以猜出来,具体就要看代码了。而app和ext都是Laucher的内部类。作为启动最主要的内容。

key3: Bootstrap是c++写的,jvm的一部分,所以在jdk里面没有。

有趣的点:

key1: Thread里面有个字段ContextClassLoader, 用来设置线程中的classLoader. 这里就有一个疑问了: 有啥用? 当前可以用上面那个场景回答,当前线程加载一下自己定义的类。

使用:

key1: classLoader里面已经写了, 自定义classLoader不要覆写loadClass, 覆写findClass; 不过并没有强制,也就是loadClass上面并没有什么final。 这样保证自定义classLoader依旧遵循双亲委派(为啥叫双亲呢, 估计是parent翻译,并不是真的有两个)。可以看一下loadClass的源码,很容易理解,先是缓存查找,找不到就父亲,没有父亲就bootstrap,最后findClass. findClass定义的就是查找类的方法。

key2: deineClass将二进制文件转成java 类。

遗留的点: 

spring的类加载器。 貌似是自定义的。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Java的类加载器在sun.misc.Launcher中初始化。 ExtClassLoader通过ExtClass...
    LordZhou阅读 764评论 0 0
  • ClassLoader翻译过来就是类加载器,普通的java开发者其实用到的不多,但对于某些框架开发者来说却非常常见...
    时待吾阅读 1,126评论 0 1
  • ClassLoader 是 Java 届最为神秘的技术之一,无数人被它伤透了脑筋,摸不清门道究竟在哪里。网上的文章...
    MobMsg阅读 606评论 2 7
  • 转发:本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 ClassLoader翻译过来就是类加载...
    尼尔君阅读 568评论 0 1
  • 文:无敌老超人 有多少人会喜爱上 花香四溢时的季节 凝望着飘落的花瓣 在花丛中如痴如醉 有多少人会喜爱着 阴雨绵绵...
    无敌老超人阅读 249评论 2 5