一.類加載器:
????????由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
????????
????????