惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

WordPress大学
WordPress大学
Microsoft Azure Blog
Microsoft Azure Blog
MongoDB | Blog
MongoDB | Blog
小众软件
小众软件
Apple Machine Learning Research
Apple Machine Learning Research
O
OpenAI News
酷 壳 – CoolShell
酷 壳 – CoolShell
The GitHub Blog
The GitHub Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
博客园 - 聂微东
Engineering at Meta
Engineering at Meta
W
WeLiveSecurity
Hacker News: Ask HN
Hacker News: Ask HN
大猫的无限游戏
大猫的无限游戏
Vercel News
Vercel News
D
Docker
F
Full Disclosure
AI
AI
罗磊的独立博客
博客园 - 【当耐特】
U
Unit 42
S
SegmentFault 最新的问题
Stack Overflow Blog
Stack Overflow Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
P
Palo Alto Networks Blog
博客园_首页
H
Help Net Security
量子位
月光博客
月光博客
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
博客园 - 司徒正美
F
Fortinet All Blogs
D
DataBreaches.Net
B
Blog RSS Feed
Webroot Blog
Webroot Blog
TaoSecurity Blog
TaoSecurity Blog
S
Secure Thoughts
爱范儿
爱范儿
I
InfoQ
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Attack and Defense Labs
Attack and Defense Labs
Application and Cybersecurity Blog
Application and Cybersecurity Blog
C
CERT Recently Published Vulnerability Notes
Martin Fowler
Martin Fowler
Blog — PlanetScale
Blog — PlanetScale
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
S
Securelist

Moon's Blog

Java内存 | Moon's Blog Spring Data JPA | Moon's Blog Spring Boot的Java Config | Moon's Blog Java知识点 | Moon's Blog Spring Boot知识点 | Moon's Blog Java异常机制 | Moon's Blog JVM类加载机制 | Moon's Blog 单体架构与微服务架构 | Moon's Blog 424.替换后的最长重复字符 | Moon's Blog 888.公平的糖果棒交换 | Moon's Blog 839.相似字符串组 | Moon's Blog 778.水位上升的泳池中游泳 | Moon's Blog 1631.最小体力消耗路径 | Moon's Blog 724.寻找数组的中心索引 | Moon's Blog 使用Jackson库实现日期序列化 | Moon's Blog 使用Jackson库实现Java多态解析 | Moon's Blog Spring Boot+InfluxDB实现日志管理 | Moon's Blog Java多态+工厂模式实现服务调用 | Moon's Blog 为Spring Boot项目生成OpenAPI3.0文档 | Moon's Blog
Java的类加载器 | Moon's Blog
Moon Lou · 2021-03-10 · via Moon's Blog

回顾JVM类加载机制,共分为加载、链接和初始化三个阶段,其中加载阶段做的第一件事,即通过一个类的全限定名来获取此类的二进制字节流,就是类加载器要做的事情。所以类加载器就是JVM通过一个类的全限定名来获取该类的二进制字节流的代码块。

JVM类加载器的双亲委派模型,如下图所示。类加载器之间的父子关系并不是父类和子类的继承关系,而是通过使用组合来实现复用父加载器的代码。

1.启动类加载器(Bootstrap ClassLoader)

也叫根类加载器,负责加载Java的核心类库,即JAVA_HOME/jre/lib目录下的jar包,比如rt.jar(包含System、String这样的核心类)等。启动类加载器是C++实现的,并不是Java实现,因此它不是java.lang.ClassLoader的子类。

2.扩展类加载器(Extension ClassLoader)

负责加载扩展目录%JAVA_HOME%/jre/lib/ext下的jar包,用户可以把自己开发的类打成包放进去,以扩展Java核心类以外的新功能。扩展类加载器派生继承自java.lang.ClassLoader,其父加载器(注意不是父类!)是启动类加载器。

3.系统类加载器(System ClassLoader)

也叫应用程序类加载器,加载CLASSPATH环境变量指定的目录下的类,一般来说就是用户在应用程序中自定义的类、以及依赖的第三方jar包等。系统类加载器派生继承自java.lang.ClassLoader,其父加载器(注意不是父类!)是扩展类加载器。

4.自定义类加载器

一般情况下,以上3种加载器能满足我们日常的开发工作,不满足时我们还可以自定义类加载器。比如用网络加载Java类,为了保证传输中的安全性,采用了加密操作,那么以上3种加载器就无法加载这个类,这时候就需要自定义类加载器。实现方法是继承java.lang.ClassLoader类重写findClass()方法

类加载的双亲委派机制:

  • 如果一个类加载器接收到了类加载的请求,它自己不会先去加载,会把这个请求委托给父类加载器去执行。
  • 如果父类还存在父类加载器,则继续向上委托,一直委托到启动类加载器。
  • 如果父类加载器可以完成加载任务,就返回成功结果,如果父类加载失败,就由子类自己去尝试加载。

源码实现:

public Class<?> loadClass(String name) throws ClassNotFoundException {
return loadClass(name, false);
}
protected synchronized Class<?> loadClass(String name, boolean resolve)
throws ClassNotFoundException
{

Class c = findLoadedClass(name);
if (c == null) {
try {
if (parent != null) {
c = parent.loadClass(name, false);
} else {

c = findBootstrapClassOrNull(name);
}
} catch (ClassNotFoundException e) {

}
if (c == null) {
c = findClass(name);
}
}
if (resolve) {
resolveClass(c);
}
return c;
}

版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Moon's Blog