类装载器体系结构在三方面对java的沙箱起作用
- 防止恶意代码去干涉善意的代码
- 守护了被信任的类库的边界
- 将代码归入某类(称为保护域),该类确定了代码可以进行哪些操作
1.防止恶意代码去干涉善意的代码(屏蔽不同命名空间的类)
命名空间:jvm为每个每个类加载器维护一个唯一的命名空间
- 一个命名空间内,只加载一个同名的类
- 一个类可以同时存在于不同的命名空间内。
- 同一命名空间内的类可直接交互,不同命名空间内的类不知彼此的存在,除非显示提供允许交互的交互。
2.守护了被信任的类库的边界
- 双亲委托:启动类加载器>扩展类加载器>应用类加载器。左边优先级最高。不同的层级的类加载器,负责加载其管辖范围的类;
不安全手段【替换核心类库】:如自己写一个java.lang.Integer,由于启动类加载器优先级最高,所以会加载核心javaAPI的java.lang.Integer,而不会让应用类加载器去加载自定义的java.lang.Integer,)
- 运行时包:由同一个类装载器装载的,属于同一个包的,多个类型的集合。
不安全手段【插入全新的类型】:如装载一个java.lang.virus(病毒),由于父类加载器中找不到,应用类加载器有机会加载这个病毒类(基于同一个包内类型可见性,暗示这个类是java api的一部分,将得到访问java.lang中被信任类的特殊访问权限,实施破坏),运行时包的限制了这种行为,因为是不同的类装载器。
- 拒绝装载特定的禁止类型