类加载器
一、概念:
java文件经过编译器编译成扩展名为class的文件。class中保存着java代码转换后的虚拟指令。当需要某个类的时候,虚拟机会加载class文件,并new对应的class对象,将class加载到虚拟机的内存,这个过程称为类加载。
二、种类(预定义类型3种)
1. 启动类加载
JVM自身需要的类,一般为%JAVA_HOME%/lib下面的jar包加载到JVM内存。
2. 扩展类加载
扩展器是由Sun的ExtClassLoader实现的,他负责将%JAVA_HOME%/lib/ext下面的或者由系统变量指定的类库加载到内存
3. 系统类加载
扩展器是由Sun的AppClassLoader实现的,负责加载系统类路径或指定路径下的类库,也就是我们经常说的classpath路径。
三、双亲委派模式
双亲委派工作原理
双亲委派要求除了启动类加载器,其余的加载器都要有父类加载器。
如果一个类加载器收到了类加载的请求,他自己不先处理,先向上找自己的父类加载,如果父类加载器还存在父类,则在向上委托,直到到达启动类加载器,如果父类加载器能处理加载任务,就成功返回,如果不行,自类加载器尝试处理。这就是双亲委派机制。
优点
JAVA类随着类加载器带有了优先级的层次关系,可以避免类的重复加载。因为如果启动类加载了,就不需要子类再去加载一遍了,可以避免重复。同时出于安全考虑,java中的核心API不会被随意篡改。比如如果我们要加载java.lang.Integer就会一直向上委派,直到启动类发现已经加载了,就直接会返回加载过的Interger.class,这样能防止核心API被篡改。
参考:类加载器