Java的ServiceLoader有多个类加载器

Java的ServiceLoader有多个类加载器,第1张

JVM有三种类加载器:bootstrap负责加载系统类,extclassloader负责加载扩展类,appclassloader负责加载应用类。他们主要是分工不一样,各自负责不同的区域,另外也是为了实现委托模型。什么是委托模型呢,其实就是当类加载器有加载需求的时候,先请示他的父类使用父类的搜索路径来加入,如果没有找到的话,才使用自己的搜索路径来来搜索类。

当执行 java class 的时候, javaexe 会帮助我们找到 JRE ,接着找到位于 JRE 内部的 jvmdll ,这才是真正的 Java 虚拟机器 , 最后加载动态库,激活 Java 虚拟机器。虚拟机器激活以后,会先做一些初始化的动作,比如说读取系统参数等。一旦初始化动作完成之后,就会产生第一个类加载器―― Bootstrap Loader , Bootstrap Loader 是由 C++ 所撰写而成,这个 Bootstrap Loader 所做的初始工作中,除了一些基本的初始化动作之外,最重要的就是加载 Launcherjava 之中的 ExtClassLoader ,并设定其 Parent 为 null ,代表其父加载器为 BootstrapLoader 。然后 Bootstrap Loader 再要求加载 Launcherjava 之中的 AppClassLoader ,并设定其 Parent 为之前产生的 ExtClassLoader 实体。这两个加载器都是以静态类的形式存在的。这里要请大家注意的是, Launcher$ExtClassLoaderclass 与 Launcher$AppClassLoaderclass 都是由 Bootstrap Loader 所加载,所以 Parent 和由哪个类加载器加载没有关系。

下面的图形可以表示三者之间的关系:

BootstrapLoader <---(Extends)----AppClassLoader <---(Extends)----ExtClassLoader

这三个加载器就构成我们的 Java 类加载体系。他们分别从以下的路径寻找程序所需要的类:

BootstrapLoader : sunbootclasspath

ExtClassLoader: javaextdirs

AppClassLoader: javaclasspath

这三个系统参量可以通过 SystemgetProperty() 函数得到具体对应的路径。大家可以自己编程实现查看具体的路径。

你没有声明这个类,肯定不能用某个类作为类型接收,因为你不知道或者说就算你知道但是你本地没有这个类型,只能使用object类型接收,如果用到其方法,也肯定要用反射来调用。

如果本地你声明了这个类,那就没有必要远程下载了。直接创建实例,使用就行。

以上就是关于Java的ServiceLoader有多个类加载器全部的内容,包括:Java的ServiceLoader有多个类加载器、关于JAVA类加载器的一些疑问,求大神、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9793660.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-02
下一篇2023-05-02

发表评论

登录后才能评论

评论列表(0条)

    保存