一、类加载器
1、是什么
Java类加载器(Java Classloader)是Java运行时环境(Java Runtime Environment)的一部分, 负责动态加载Java类到Java虚拟机的内存空间中。
2.有哪些
java默认有三种类加载器,BootstrapClassLoader、ExtensionClassLoader、App ClassLoader。
BootstrapClassLoader(引导启动类加载器): 嵌在JVM内核中的加载器,该加载器是用C++语言写的,主要负载加载JAVA_HOME/lib下的类库,引 导启动类加载器无法被应用程序直接使用。
ExtensionClassLoader(扩展类加载器): ExtensionClassLoader是用JAVA编写,且它的父类加载器是Bootstrap。 是由sun.misc.Launcher$ExtClassLoader实现的,主要加载JAVA_HOME/lib/ext目录中的类 库。 它的父加载器是BootstrapClassLoader
App ClassLoader(应用类加载器): App ClassLoader是应用程序类加载器,负责加载应用程序classpath目录下的所有jar和class文 件。它的父加载器为Ext ClassLoader
二、双亲委派模型
1.介绍
图片转自: 文章
类通常是按需加载,即第一次使用该类时才加载。由于有了类加载器,Java运行时系统不需要知道文件与 文件系统。学习类加载器时,掌握Java的委派概念很重要。
双亲委派模型:如果一个类加载器收到了一个类加载请求,它不会自己去尝试加载这个类,而是把这个请求 转交给父类加载器去完成。每一个层次的类加载器都是如此。
因此所有的类加载请求都应该传递到最顶层的 启动类加载器中,只有到父类加载器反馈自己无法完成这个加载请求(在它的搜索范围没有找到这个类) 时,子类加载器才会尝试自己去加载。委派的好处就是避免有些类被重复加载。
note 即
1.所有类都会先被送到顶层的Bootstrap类加载器,并在这个过程中判断是否已经被加载。
2.从顶层向下尝试加载,一旦可以加载,就由这一层加载,并退出。
2.类加载方式
① 显示加载
classloader.loadClass( className)
Class.forName( className)
② 隐式加载
3.好处和例子
1)避免类的重复加载
2)保护程序安全,防止核心API被随意篡改
例子
- idea在src目录下创建java.lang包,然后在这个包里面创建一个名为String的类。
String类内容如下:
package java.lang;
public class String {
static {
System.out.println("my String loaded");
}
}
- 测试类
public class Test {
public static void main(String[] args) throws ClassNotFoundException {
String s = new java.lang.String();
System.out.println("完成");
Class.forName("java.lang.String");
}
}
运行结果:
自定义String的静态代码块没有执行,说明它没有被加载,应证了保护核心API的优点。