Java虚拟机之双亲委派机制详解

 更新时间:2021年12月30日 16:04:51   作者:MrDJun  
这篇文章主要为大家介绍了Java虚拟机之双亲委派机制,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助

Java虚拟机对class文件采用的是按需加载的方式,也就是说当需要使用该类时才会将它的class文件加载到内存生成class对象。而且加载某个类的class文件时,Java虚拟机采用的是双亲委派模式,即把请求交由父类处理,它是一种任务委派模式。

Tips:如果在工程目录的src下新建一个名为 java.lang 的包,在其中新建一个类名String的类,这个类能够正常运行吗?

程序代码如下:

package java.lang;
public class String {
    static {
        System.out.println("能够初始化我吗?");
    }
}
public class Application {
    public static void main(String[] args) {
        java.lang.String str = new java.lang.String();
        System.out.println("hello,world");
    }
}

执行结果:

hello,world

说明并未初始化在java.lang包下自定义的String类。这是双亲委派机制保护了我们系统核心API不容易被破坏。

一、原理

1、如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行。

2、如果父类加载器还存在其父类加载器,则进一步向上委托,依次递归请求最终将到达顶层的启动类加载器。

3、如果父类加载器可以完成类加载任务,就成功返回,倘若父类加载器无法完成此加载任务,子加载器才会尝试自己去加载,这就是双亲委派模式。

在这里插入图片描述

二、作用

1、保护程序安全,防止核心API被随意篡改。在java.lang包下,开发者自定义的类中的main方法不允许执行,防止恶意代码对程序产生破坏。

2、避免类的重复加载。一个类只会被加载一次。

三、沙箱安全机制

自定义string类,但是在加载自定义String类的时候会率先使用引导类加载器加载,而引导类加载器在加载的过程中会先加载jdk自带的文件(rt. jar包中java\lang\String.class),报错信息说没有main方法,就是因为加载的是rt. jar包中的String类。这样可以保证对java核心源代码的保护,这就是沙箱安全机制。

四、补充内容

在JVM中表示两个class对象是否是同一个类的两个必要条件

1、类的完整路径一直(包名+类名)。

2、加载这个类的ClassLoader必须相同。

换句话说,在JVM中, 即使这两个类对象(class对象)来源同一个Class文件,被同一个虚拟机所加载,但只要加载它们的ClassLoader实例对象不同,那么这两个类对象也是不相等的。

对类加载器的引用

JVM必须知道–个类型是由启动加载器加载的还是由用户类加载器加载的。如果一个类型是由用户类加载器加载的,那么JVM会将这个类加载器的一个引用作为类型信息的一部分保存在方法区中。当解析一个类型到另一个类型的引用的时候,JVM需要保证这两个类型的类加载器是相同的。

Java程序对类的使用方式分为:主动使用、被动使用两种方式

主动使用,又分为七种情况:

1、创建类的实例

2、访问某个类或者接口的静态变量,或者对该静态变量赋值

3、反射( 比如:Class.forName(“java.lang.String)))

4、初始化一个类的子类

5、java虚拟机启动时被标明为启动类的类

6、java 7开始提供的动态语言支持

除了以上七种情况,其他使用Java类的方式都被看作是对类的被动使用都不会导致类的初始化

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!

相关文章

  • springboot自定义yml配置文件及其外部部署过程

    springboot自定义yml配置文件及其外部部署过程

    这篇文章主要介绍了springboot自定义yml配置文件及其外部部署过程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • Java BigDecimal详解_动力节点Java学院整理

    Java BigDecimal详解_动力节点Java学院整理

    BigDecimal 由任意精度的整数非标度值 和32 位的整数标度 (scale) 组成。接下来通过本文给大家介绍Java BigDecimal详解,需要的的朋友参考下吧
    2017-04-04
  • Java实现Redis哨兵的示例代码

    Java实现Redis哨兵的示例代码

    这篇文章主要介绍了Java实现Redis哨兵的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • Java并发编程示例(三):线程中断

    Java并发编程示例(三):线程中断

    这篇文章主要介绍了Java并发编程示例(三):线程中断,在本节,我们所开发的示例程序将会创建一个线程,五秒钟后,利用中断机制强制中止这个线程,需要的朋友可以参考下
    2014-12-12
  • m1 Mac设置多jdk版本并动态切换的实现

    m1 Mac设置多jdk版本并动态切换的实现

    本文主要介绍 Mac 下如何安装 JDK 并且多版本如何切换,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • Spring Boot 实例代码之通过接口安全退出

    Spring Boot 实例代码之通过接口安全退出

    这篇文章主要介绍了Spring Boot 实例代码之通过接口安全退出的相关资料,需要的朋友可以参考下
    2017-09-09
  • 详解SpringMVC如何进行数据回显

    详解SpringMVC如何进行数据回显

    这篇文章主要介绍了详解SpringMVC如何进行数据回显,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • 基于@JsonProperty的使用说明

    基于@JsonProperty的使用说明

    这篇文章主要介绍了基于@JsonProperty的使用说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • springboot2学习世界著名程序springboot开发体验

    springboot2学习世界著名程序springboot开发体验

    这篇文章主要为大家介绍了世界著名程序springboot开发体验,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • spring框架学习总结

    spring框架学习总结

    Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson创建。简单来说,Spring是一个分层的JavaSE/EE full-stack(一站式) 轻量级开源框架
    2021-06-06

最新评论