您现在的位置是:首页 > 正文

jvm原理(18)类加载器命名空间总结与扩展类加载器要点分析

2024-02-01 05:52:01阅读 3

类加载双亲委托模型的好处:
1、可以确保Java核心库的类型安全:所有的Java应用都至少会引用Java.lang.Object类,也就是说在运行期,java.lang.Object这个类会被加载到Java虚拟机中,如果这个加载过程是由Java应用自己的类加载器所完成的,
那么很有可能就会在JVM中存在多个版本的java.lang.Object类,而且这些类库中的类的加载工作都是由启动类加载器来统一完成,从而确保了Java应用所使用的都是同一个版本的Java核心类库,他们之间是相互兼容的。
2、可以确保Java核心类库所提供的类不会被自定义的类所替代。
3、不同的类加载器可以为相同名称(binary name)的类创建额外的命名空间,相同名称的类可以并存在Java虚拟机中,只需要用不同的类加载器来加载他们即可。不同类加载器所加载的类之间是不兼容的,这就相当于在Java
虚拟机内部创建了一个又一个相互隔离的Java类空间,这类技术在很多框架中得到了实际应用。

扩展类加载器:
看一段程序:

public class MyTest22 {
    static{
        System.out.println("MyTest22 initializer=");
    }
    public static void main(String[] args) {
        System.out.println(MyTest22.class.getClassLoader());
        System.out.println(MyTest.class.getClassLoader());
    }
}

运行结果:

MyTest22 initializer=
sun.misc.Launcher$AppClassLoader@18b4aac2
sun.misc.Launcher$AppClassLoader@18b4aac2

很明显他们都是由应用类加载器加载,我们能不能想办法让扩展类加载器加载他们呢,试想我们修改变量【Java.ext.dirs】指向当前程序所在的路径是不是就可以了呢?
为此我们定位到【jvm_lecture\out\production\classes】下边,执行命令:
java -Djava.ext.dirs=./ com.twodragonlake.jvm.classloader.MyTest22
这里写图片描述
奇怪的是按照双亲委托模型,在去加载MyTest22的时候先是应用类加载器委托扩展类加载器,扩展类加载器的加载路径是当前路径,MyTest22也在当前路径下边,但是为什么还是应用类加载器加载的呢?
这是因为扩展类加载器只能通过jar的形式来加载,不能加载class文件的形式,因此我们把MyTest文件放到jar里边:

E:\Study\intelIde\jvm_lecture\out\production\classes>jar cvf test.jar com/twodragonlake/jvm/classloader/MyTest.class
已添加清单
正在添加: com/twodragonlake/jvm/classloader/MyTest.class(输入 = 657) (输出 = 373)(压缩了 43%)

然后我们运行MyTest22程序:

E:\Study\intelIde\jvm_lecture\out\production\classes>java -Djava.ext.dirs=./ com.twodragonlake.jvm.classloader.MyTest22
MyTest22 initializer=
sun.misc.Launcher$AppClassLoader@2a139a55
sun.misc.Launcher$ExtClassLoader@75b84c92

结果发生了变化,MyTest22是由应用类加载器加载器没啥问题,MyTest由于放到jar包里边,应用类加载器在委托给扩展类加载器的时候,扩展类加载器在当前目录里边的test.jar里边找到了MyTest的class文件,为此扩展类加载器加载了MyTest。
如果我们运行【java -Djava.ext.dirs=/ com.twodragonlake.jvm.classloader.MyTest22】即将根目录作为扩展类加载的加载路径,运行结果肯定都是由应用类加载器加载,因为扩展类加载器在根目录下找不到MyTest。

E:\Study\intelIde\jvm_lecture\out\production\classes>java -Djava.ext.dirs=/ com.twodragonlake.jvm.classloader.MyTest22
MyTest22 initializer=
sun.misc.Launcher$AppClassLoader@73d16e93
sun.misc.Launcher$AppClassLoader@73d16e93

网站文章

  • win系统下64位Julia链接fortran的方法

    win系统下64位Julia链接fortran的方法

    综合网络上各位大佬的方法,实现了在win系统下64位Julia链接fortran的方法。

    2024-02-01 05:51:55
  • 堆

    一.堆的定义堆是计算机科学中一类特殊的数据结构的统称,堆通常可以被看做是一棵完全二叉树的数组对象。二.API设计三.代码实现public class Heap<T extends Comparable...

    2024-02-01 05:51:26
  • 你的网卡真有千兆么?——千兆网卡传输速度解析 热门推荐

    随着PS3it技术的破解和可以利用电脑FTP向PS3传送文件,千兆网卡成为了不少玩家必备的工具。要知道PS3it技术本身自带千兆网卡,如果利用FTP软件以及电脑上的千兆网卡进行文件传输,其速度远比采用...

    2024-02-01 05:51:19
  • JavaScript Equality Table

    JavaScript Equality Table

    Tables displaying the issue: and == Moral of the story use ===

    2024-02-01 05:51:13
  • Autoware pure_pursuit节点适配差速底盘

    Autoware pure_pursuit节点适配差速底盘

    Autoware pure_pursuit节点输出的话题是 "/twist_raw", 需要转换为我们小车底盘控制速度的话题,我这里直接用"/cmd_vel"。主要任务是消息格式的转换,下面详细介绍。...

    2024-02-01 05:50:44
  • 调用API

    3.编写API请求:编写代码向API发送请求,包括所需参数和API密钥等。使用最常见的请求方法是HTTP请求,包括GET、POST、PUT、DELETE等。4.解析API响应:API会返回响应数据,需...

    2024-02-01 05:50:30
  • Codeforces 1221E. Game With String

    传送门首先每一段连续的 $...$ 都是互不影响的,所以可以一段段考虑考虑最简单的情况,此时每一段都大于等于 $a$ 并且小于 $2b$ ,那么每一段都只能放一次,胜负直接根据段数即可得到答案考虑如果存在段长小于 $a$ 却大于等于 $b$ 的情况,此时后手可以随时放在那个位置,当然也可以不放,这样胜负就被掌握在后手手里(他可以随时选择交换先后手)所以对于上面那一种情况,...

    2024-02-01 05:50:23
  • spring boot 整合sharding jdbc 遇到的一些问题以及实例源码

    spring boot 整合sharding jdbc 遇到的一些问题以及实例源码

    文章目录一、整合1.pom.xml 新增依赖(这里默认你项目中已经有了Mysql的依赖)2.配置3.遇到的问题“The bean 'dataSource', defined in class path...

    2024-02-01 05:49:55
  • mysqld_safe Directory &#39;/var/lib/mysql&#39; for UNIX socket file don&#39;t exists

    原因:mysql找不着socket文件。 解决办法: 1、修改mysql配置文件my.cnf中[mysqld]下的socket配置项。效果如下。 [mysqld] socket = /tmp/mysql.sock 2、终极解决办法:重启服务器。 ...

    2024-02-01 05:49:47
  • 洛谷 P1618

    https://www.luogu.org/problemnew/show/P1618 题目描述 将1,2,…,9共9个数分成三组,分别组成三个三位数,且使这三个三位数的比例是A:B:C,试求出所有满足条件的三个三位数,若无解,输出“No!!!”。 //感谢黄小U饮品完善题意 输入输出格式 输入格式: 三个数,A B C。 输出格式: 若干行,每行3个数字。按照每...

    2024-02-01 05:49:41