目录
一、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的情况下; | JDK9 | Bootstrap 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加载的模块。后面会再深入理解下设计思路和具体实现。
|