栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

JVM (三) 双亲委派机制

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JVM (三) 双亲委派机制

双亲委派机制
  • 双亲委派机制工作原理以及演示
    • 工作原理
    • 双亲委派机制的优势
  • 沙箱安全机制

双亲委派机制工作原理以及演示
Java虚拟机对class 文件采用的是 按需加载 的方式,也就是说当需要是使用该类时才会将它的class文件加载到内存生成Class 对象,而且加载某个类的class文件时,Java虚拟机采用的是 双亲委派机制,即把请求交由父类(上级类加载器)处理,它是一种委派机制

代码演示

public class StringTest {
    public static void main(String[] args) {
    	//使用的是java.lang.String
        String s = new String();
        System.out.println("程序没问题");
    }
}

自定义 java.lang.String 类 和java核心PAI 同包同名

package java.lang;

public class String {
    static {
        System.out.println("我是自定义String 类,我能被加载吗");
    }
}

运行StringTest
输出结果如下, 并没有输出我们自定义的String中的静态方法中的输出语句,说明我们的类没有没加载。

程序没问题

尝试运行自定义的String,添加main方法

public class String {
    static {
        System.out.println("我是自定义String 类,我能被加载吗");
    }

    public static void main(String[] args) {
        System.out.println("自定义String的main 方法,会被执行吗?");
    }
}

运行结果

错误: 在类 java.lang.String 中找不到 main 方法, 请将 main 方法定义为:
   public static void main(String[] args)
否则 JavaFX 应用程序类必须扩展javafx.application.Application

为什么找不到main方法呢?
因为是双亲委派机制,会交由父类来处理,到最上层启动类加载器时,一看是 Java.lang 下的(启动类加载器只负责夹杂Java核心API 的类),就由启动类加载器加载,源码String是肯定没有main方法的

工作原理
  1. 如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行。
  2. 如果父类加载器还存在其父类加载器,则进一步向上委托,依次递归,请求最终将到达顶层的启动类加载器。
  3. 如果父类加载器可以完成类加载任务,就成功返回,倘若父类加载器无法完成此加载任务,子加载器才会尝试自己去加载,这就是双亲委派机制

  4. 例子二
    在这里插入图片描述
双亲委派机制的优势
  1. 避免类的重复加载,(父类加载,子类就不加载了)
  2. 保护程序安全,防止核心API被随意篡改
    自定义类:java.lang.String
    自定义类:java.lang.StringTest01
package java.lang;

public class StringTest01 {
    static {
        System.out.println("我是自定义StringTest01 类,我能被加载吗");
    }

    public static void main(String[] args) {
            System.out.println("自定义StringTest01的main 方法,会被执行吗?");
    }
}

运行StringTest01 结果如下

java.lang.SecurityException: Prohibited package name: java.lang
	at java.lang.ClassLoader.preDefineClass(ClassLoader.java:662)
	at java.lang.ClassLoader.defineClass(ClassLoader.java:761)
	at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
	at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
	at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
	at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
	at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:338)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
	at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:495)
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" 

原因分析: 启动类加载器压根就找不到StringTest01

沙箱安全机制

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/937182.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号