类加载机制——双亲委派模式&沙箱安全机制
类加载器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.它将代码归入保护域,确定了代码可以执行哪些操作