ClassLoader简介
ClassLoader负责在运行时将Java类动态加载到JVM中,ClassLoader是JRE的一部分。因此,由于ClassLoader的存在,JVM无需了解底层文件和文件系统即可运行Java程序。
此外,ClassLoader不会一次性将所有Java类加载到内存中,而是在应用程序需要时加载。这是ClassLoader工作的地方。classloader负责将类加载到内存中。
内置CLassLoader类型
下面是一个简单的示例,说明加载其他类的ClassLoader。
如果运行上述方法,将按如下方式打印:
如您所见,有三个class loader:app class loader、ExtClassLoader和BootstrapClassLoader。BootstrapClassLoader显示为null,因为它是C/C编写的本机代码,而不是Java代码。
AppClassLoader加载上述示例方法的类(Test),AppClassLoader将Java类加载到类路径中。
接下来,ExtClassLoader加载Logging类,而ExtClassLoader加载标准内核Java扩展类-%JAVA_HOME%/jre/lib/ext下的类。
最后,BootstrapClassLoader加载ArrayList类,该类是所有ClassLoader的父类。
BootstrapClassLoader
Java类由Java.lang.ClassLoader的实例加载,但AppClassLoader本身是Java类。所以谁会加载应用类加载程序(java.lang.classloader)?
这是BootstrapClassLoader起作用的地方。
BootstrapClassLoader负责加载JDK内部类、rt.jar和%JAVA_HOME%/lib目录下的其他核心库,ext目录是扩展库。此外,BootstrapClassLoader还是其他ClassLoader实例的爸爸。
BootstrapClassLoader是JVM的一部分,以本机代码(C/C)编写,并在不同平台上实施。
ExtClassLoader
BootstrapClassLoader的子类ExtClassLoader负责从JDK的扩展目录% Java _ home%/lib/ext/目录或环境变量java.ext加载标准内核的Java扩展类
AppClassLoader
AppClassLoader将所有应用程序级类加载到JVM中,加载到类环境变量CLASSPATH下的文件中,并且是ExtClassLoader的子类。
ClassLoader是如何工作的?
ClassLoader是JRE的一部分,当JVM请求类时,ClassLoader将查找该类,并使用完全限定的类名加载该类。
如果在运行Java.lang.Cla()方法时负责加载类,则首先尝试根据完全限定的类名加载类;如果未加载到该类,则委托给超类ClassLoader以递归方式执行。
最后,如果父类ClassLoader找不到该类,子类将调用java.net.URLCla()方法在文件系统中查找该类。如果最后一个子类ClassLoader也无法加载类,则会引发java.lang.NoClassDeFoundError或Java . lang . classnotfoundexcrption异常。
从调用Java.lang.ClassForName()开始,首先通过超类ClassLoader加载类,然后尝试通过java.net.URLCla()查找class本身。如果找不到该类,将引发ClassNotFoundException异常。
ClassLoader有三个重要功能:
委托模型
ClassLoader遵循根据请求查找类或资源的委托模型。ClassLoader实例将对类或资源的搜索委托给父ClassLoader。
假设有请求将应用程序类加载到JVM中。AppClassLoader将其类的加载委托给父ExtClassLoader,父ExtClassLoader委托给BootstrapClassLoader。
只有当BootstrapClassLoader和ExtClassLoader未能成功加载类时,AppClassLoader才会加载类。
类唯一性
委托模型的结果便于确保class的唯一性。因为我们总是想向上委托。如果父类ClassLoader找不到该类,则只直接加载当前的ClassLoader实例。
可见性
子类ClassLoader显示在父类ClassLoader加载的类中。
例如,BootstrapClassLoader加载的类对ExtClassLoader加载的类具有可见性,反之亦然。
如果AppClassLoader加载a类,ExtClassLoader加载b类,则AppClassLoader加载的其他类将同时显示a和b。
但是,如果ExtClassLoader加载另一个类,则只显示b类。
1.《【showta】Java的ClassLoad》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。
2.《【showta】Java的ClassLoad》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/yule/2847840.html