JVM双亲委派机制与沙箱安全机制

双亲委派机制

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

原理
①如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行;
②如果父类加载器还存在其父类加载器,则进一步向上委托,依次递归,请求最终到达顶层的引导类加载器
③如果父类加载器可以完成类加载任务,就成功返回,倘若父类加载器无法完成此加载任务,子加载器才会尝试自己去加载

image.png

优势
①避免重复加载
②保护程序安全,防止核心API被随意篡改

自定义类 java.lang.String

package java.lang;

public class String {

    public static void main(String[] args) {
        System.out.println("hello");
    }
}
// 执行结果
错误: 在类 java.lang.String 中找不到 main 方法, 请将 main 方法定义为:
   public static void main(String[] args)
否则 JavaFX 应用程序类必须扩展javafx.application.Application

虽然执行的是自定义String类,但是最终String类的加载是由引导类加载器加载,而引导类加载的String类是rt.jar包中的String类,并不是我们自定义的String类,所以报错信息说没有main方法,这样可以保证对核心源代码的保护,这就是沙箱安全机制


自定义类 java.lang.Hello

package java.lang;

public class Hello {

    public static void main(String[] args) {
        System.out.println("hello");
    }
}

// 执行结果
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:468)
    at java.net.URLClassLoader.access$100(URLClassLoader.java:74)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:369)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:363)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:362)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
    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" 

查看源码,引导类加载器不允许以 java. 作为一级包名

image.png

你可能感兴趣的:(JVM双亲委派机制与沙箱安全机制)