类加载机制——双亲委派模式&沙箱安全机制

类加载器Bootstrap ClassLoader Ext ClassLoader App ClassLoader

  • 类加载器收到类加载的请求。
  • 将这个请求向上委托给父类加载器去完成。一直向上委托,直到启动类加载器。
  • 启动类加载器检查是否能够加载当前类,能就使用当前的加载器,否则通知子类加载器进行加载。
  • 重复此步骤
  • 找不到 Class Not Found

类加载器测试1

public class T {
    public static void main(String[] args) {
        T t1 = new T();
        T t2 = new T();
        T t3 = new T();
        Class<T> tClass = T.class;
        Class<T> t1Class = (Class<T>) t1.getClass();
        System.out.println("==========================两种获取Class方式:==========================");
        System.out.println(tClass + "Class的hashcode:" + tClass.hashCode());
        System.out.println(t1Class + "Class的hashcode:" + t1Class.hashCode());

        System.out.println("==========================类是模板,对象是具体的==========================");
        System.out.println("Class的hashcode:" + t1.getClass().hashCode() + ";对象的hashcode:" + t1.hashCode());
        System.out.println("Class的hashcode:" + t2.getClass().hashCode() + ";对象的hashcode:" + t2.hashCode());
        System.out.println("Class的hashcode:" + t3.getClass().hashCode() + ";对象的hashcode:" + t3.hashCode());
        System.out.println(t1.getClass().hashCode() == t2.getClass().hashCode() && t2.getClass().hashCode() == t3.getClass().hashCode());

        System.out.println("=======================启动类加载器返回null,因为是C写的=============================");
        ClassLoader classLoader = tClass.getClassLoader();
        System.out.println("当前类加载器:" + classLoader +
                "\n父类加载器(jdk\\jre\\lib\\ext):" + classLoader.getParent() +
                "\n父类的父类加载器(jdk1.8.0_131\\jre\\lib\\rt.jar):" + classLoader.getParent().getParent());

    }
}

 

 

类加载器测试2-破坏String类

package java.lang;

public class String {
    static void m(){}
    public static void main(String[] args) {
        m();
    }
}

 

 沙箱安全机制

  沙箱主要限制系统资源访问,那么系统支援包括什么?CPU、内存、文件系统、网络。不同级别的沙箱对这些资源访问也可以不一样。

  将java代码限定在虚拟机(jvm) 特定的运行范围中,并且严格限制代码对本地系统资源的访问,通过这样的措施来保证对代码的有效隔离,防止对系统造成破坏。

沙箱的基本组件

字节码校验器:确保Java类文件遵循java语言规范。这样可以帮助Java实现内存保护。但并不是所有类文件都会经过字节码校验,比如核心类。

类装载器:在三个方面对沙箱起作用

  1.防止恶意代码去干涉善意代码(双亲委派机制)

  2.守护了被信任的类库边界

  3.它将代码归入保护域,确定了代码可以执行哪些操作

posted @ 2022-06-15 22:21  禁止摆烂  阅读(86)  评论(0)    收藏  举报