jvm类加载器模块图解 类加载器类型一共两种,引导类加载器bootstarpClassLoader和自定义加载器 userDefinedClassLoader(系统加载器和appSource加载器也归于自定义加载器)
1.启动类加载器 (引导类加载器Bootstrap ClassLoader)
使用C/C++编写,嵌套在jvm内部加载核心类库(rt.jar、resources.jar),提供JVM自身需要的类不继承ClassLoader,没有父记载器加载扩展类和应用程序类加载器,并作为他们的父类出于安全考虑,只加载包为java、javax、sun等开头的包2.扩展类加载器(Extension ClassLoader)
java语言编写派生于ClassLoader父类记载器为启动类加载器、从java.ext.dirs指定目录类库或者Jdk的lib/ext目录下类库,如果用户创建的Jar包放此目录下,也会用扩展类加载器加载3.应用程序加载器(AppClassLoader)
java语言编写派生于ClassLoader父类记载器为启动类加载器加载环境变量classpath指定的类库程序默认的加载器,java应用的类都是由它来完成4.自定义加载器
隔离加载类修改加载类方式扩展加载源防止源码泄露此时打印的就是AppClassLoader加载器去加载 案列:如果你自己定义个和java的String一样的方法,它会被BootStrap ClassLoader加载,此时就是加载java自带的String,而不是加载你自定义的String,因为Java自带的String没有Main方法,所以报错
机制叫沙箱安全机制
package java.lang; public class String { // 在类 java.lang.String 中找不到 main 方法 public static void main(String[] args) { // TODO Auto-generated method stub System.out.println("双亲委派机制"); } } 当你创建一个Java.lang自定义的类时,BootStrap ClassLoader会阻止你创建package java.lang;
public class TestA { //Exception in thread “main” java.lang.SecurityException: Prohibited package name: java.lang public static void main(String[] args) { // TODO Auto-generated method stub System.out.println(“aa”); }
}
双亲委派机制优势
避免重复加载防止核心API被串改,保护程序