IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 理解Java ClassLoader -> 正文阅读

[网络协议]理解Java ClassLoader

目录

一、Java ClassLoader是什么?

二、Java ClassLoader有哪些类型?

三、如何查看ClassLoader加载的模块?

四、结语


一、Java ClassLoader是什么?

Java ClassLoader是JRE(Java Runtime Environment)的一部分,它将Java类动态加载到Java虚拟机中。Java类不会一次全部加载到内存中,只有在应用程序需要时,JRE才会调用Java ClassLoader将Java类动态加载到内存中。

二、Java ClassLoader有哪些类型?

从1.2版本开始,JDK已经实现了三层结构的Class Loader。JDK9中保留了三层结构,同时为了兼容性和安全性,做了一些改变来实现module system。

Java ClassLoder类型

描述
JDK9之前BootStrap ClassLoader

仅在虚拟机内实现(C/C++编写),无法通过ClassLoader API获得;

负责加载JRE/lib/rt.jar中的类

Extension ClassLoader

Java.net.URLClassLoader类的一个实例;

负责加载JRE/lib/ext下的类

Application ClassLoader

Java.net.URLClassLoader类的一个实例;

负责加载?CLASSPATH下的类;

System class loader - 在没有通过系统属性java.system.class.loader指定备选system loader的情况下;

JDK9Bootstrap class loader

在库代码和虚拟机内实现,无法通过ClassLoader API获得;

加载Java SE和JDK核心模块;

没有父级;

Platform class loader

JDK8: Extension class loader

不再是URLClassLoader的实例。它是一个内部类,且不再通过扩展机制加载类;

加载平台相关的模块(Java平台APIs及实现类、JDK特定的运行时类 );

父级为BootStrap class loader;

System class loader

也叫Application class loader

不再是URLClassLoader实例, 而是一个内部类;

加载应用class path,module path及JDK特定工具中的类;

父级为Platform class loader;

三、如何查看ClassLoader加载的模块?

BootStrap ClassLoader加载的类型被隐式授予所有安全权限(AllPermission),但其中许多类型实际上并不需要所有权限。对于不需要所有权限的模块,将它们定义给Platform ClassLoader,并在默认安全策略文件中授予它们实际需要的权限。

那么如何查看各个加载器加载的模块?

以笔者安装的JDK11为例,可以通过以下API来查看相应的加载器及其定义的模块。


ClassLoader.getSystemClassLoader()? -->?System class loader????????

System class loader 加载的JDK模块(用于提供工具或导出工具API):

?

Debug代码:?


ClassLoader.getPlatformClassLoader() -->?Platform class loader

Platform class loader加载的Java SE和JDK模块:?

Debug代码:?


ClassLoader.getPlatformClassLoader().getParent()?--> null

可以通过debug方式查看Platform ClassLoader的parent ClassLoader,也就是BootStrap class loader

Bootstrap class loader加载的Java SE和JDK模块:?

Debug代码查看:?

:模块java.base?定义了JAVA SE平台的基本API,包含常用的package(比如java.lang、java.util等)。具体细节可以查看官方文档。

如何查看类的ClassLoader是哪个?

可以通过ClassName.class.getClassLoader() 方式查看。

比如:

1) String.class.getClassLoader() -> 返回null

String对应的包是java.lang,模块是java.base,该模块是Bootstrap class loader加载的。

2)?java.sql.Date.class.getClassLoader() -> 返回jdk.internal.loader.ClassLoaders$PlatformClassLoader@...

java.sql所在模块是java.sql,该模块是Platform class loader加载的。

四、结语

回顾一下Java ClassLoader的用途、类型以及在JDK11中ClassLoader加载的模块。后面会再深入理解下设计思路和具体实现。

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-12-25 11:42:15  更:2022-12-25 11:43:10 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 15:36:00-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码