一.类加载器:
由JDK提供的,用于加载一些资源文件到JVM内存里的一项技术。主要是加载class文件到内存,也可以加载一些资源文件。
2.JDK提供了三个类加载器:
-
BootstrapClassLoader:引导类加载器, 是c语言编写的。
用于加载JDK的核心类,加载 jre/lib/rt.jar
-
ExtClassLoader:扩展类加载器,是Java编写的,使用很少
用于加载一些扩展程序 jre/lib/ext/*.jar,目前几乎不用了
-
SystemClassLoader:或者叫AppClassLoader, 系统类加载器,是Java编写的
用于加载我们写的类、第三方jar包里的类
3.获取类加载器SystemClassLoader:我们的类.class.getClassLoader()
import java.io.*;
/**
* @author liuyp
* @since 2024/02/29
*/
public class Demo01ClassLoader {
public static void main(String[] args) throws Exception {
ClassLoader classLoader = Demo01ClassLoader.class.getClassLoader();
System.out.println("classLoader = " + classLoader);
//我们应该把资源文件放到当前Module的类路径下(src);类加载器就从src下查找文件
// InputStream is = classLoader.getResourceAsStream("abc.txt");
InputStream is = classLoader.getResourceAsStream("demo05/hello.txt");
BufferedReader reader = new BufferedReader(new InputStreamReader(is, "utf-8"));
String line = reader.readLine();
System.out.println("line = " + line);
reader.close();
}
}
二.双亲委派
1.先传到AppClassLoader,寻找缓冲,如果找到直接用,不需要加载,找不到传到父加载类extClassLoader
2.寻找缓冲,如果找到直接用,不需要加载,找不到传到父加载类bootstraptClassLoader
3.寻找缓冲,如果找到直接用,不需要加载,找不到就自己加载
4.bootstrapClassLoader从rt.jar里先尝试加载,如果找到就直接用,找不到就传extClassLoader
5.扩展类加载器从jre/lib/ext里加载如果能加载到就直接用,加载不到就传到appClassLoader
6.程序类加载器从src或者jar包里找,如果找到直接用,找不到报ClassNotFoundException错误
作用:防止重复加载类和篡改类
1.当一个类加载成功之后,会缓存起来,下次在用时,直接取缓冲的值不会重复加载
2.自己定义java.lang.String,它在引导类加载器,自己创建在程序类加载器,当所有加载器缓存中找不时,从引导类加载器开始加载类,最后才是程序类加载器,所以用的一定是jdk的Sstring