java虚拟机对class文件采用的是按需加载的方式,就是说使用该类时才会将它的class文件加载到内存生成class对象。
而且加载某个类的class文件时,java虚拟机采用的是双亲委派模式,即把请求交给父类处理。
工作原理:
(1)如果一个类加载器收到了类加载请求,并不会自己先去加载,而是把这个请求委托给父类加载器区执行
(2)如果父类加载器还存在父类加载器,那么进一步向上委托,依此递归,请求最终将达到顶层的启动类加载器
(3)如果父类加载器可以完成类加载任务,就成功返回,如果父类加载器无法完成加载任务,子加载器才会尝试自己加载。
优点:
避免类的重复加载,防止核心API被随意篡改。
沙箱安全机制:
如果自定义一个String类,但是在加载自定义String类的时候会率先使用引导类加载器加载,而引导类加载器在加载的过程中会加载jdk自带的文件,这样可以保证对java核心源代码的保护。
这就是沙箱安全机制。
- public class String {
- //
- static{
- System.out.println("我是自定义的String类的静态代码块");
- }
- //错误: 在类 java.lang.String 中找不到 main 方法
- public static void main(String[] args) {
- System.out.println("hello,String");
- }
- // 加载jdk中的java.lang.String而不会加载自定义的java.lang.String中的main方法
- }