類加載器的作用
1.類加載器的作用:將class字節碼內容加載到內存中,並將這些靜態數據轉換成方法區運行時數據結構,然后在堆中形成代表這個類的java.lang.Class對象,作為方法區中類數據的訪問入口。
2.類緩存:標准的javaSE類加器按照要求查找類,但一旦某個類被加載到類加載器中,它將維持加載(緩存)一段時間,不過JVM垃圾回收機制也會回收這些Class對象。
類加載器的作是用來把類(class)加載到內存的,JVM規范了如下類加載器:
1.引導類加載器:用c++編寫,是JVM自帶的類加載器,負責java平台核心庫,用來裝載核心類庫,該加載器無法直接獲取;
2.擴展類加載器:負責jre/lib/ext目錄下的jar包或 -D java.ext.dirs 指定下的jar包裝入工作庫
3.系統類下載器:負責java-classpath或者 -D java.class.path所指的目錄下的類與jar包裝入工作,是最常用的加載器
下面是示例程序:
package com.han.reflection;
/*
類加載器
*/
public class Test06 {
public static void main(String[] args) throws ClassNotFoundException {
//系統類加載器
//sun.misc.Launcher$AppClassLoader@18b4aac2
ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
System.out.println(systemClassLoader);
//系統類加載器的父類->擴展類加載器
//sun.misc.Launcher$ExtClassLoader@4554617c
ClassLoader parent = systemClassLoader.getParent();
System.out.println(parent);
//擴展類加載器的父類->根加載器
//null(C/C++,javas是獲取不到的)
ClassLoader parent1 = parent.getParent();
System.out.println(parent1);
//獲取當前類的類加載器
//sun.misc.Launcher$AppClassLoader@18b4aac2
ClassLoader classLoader = Class.forName("com.han.reflection.Test06").getClassLoader();
System.out.println(classLoader);
//測試jdk內部的類是誰加載的,獲取java.lang.Object類加載器
//null
classLoader = Class.forName("java.lang.Object").getClassLoader();
System.out.println(classLoader);
//如何獲取系統類加載器可以加載的路徑
/*
D:\java\jdk\jdk 1.8\jdk\jre\lib\charsets.jar;
D:\java\jdk\jdk 1.8\jdk\jre\lib\deploy.jar;
D:\java\jdk\jdk 1.8\jdk\jre\lib\ext\access-bridge-64.jar;
D:\java\jdk\jdk 1.8\jdk\jre\lib\ext\cldrdata.jar;
D:\java\jdk\jdk 1.8\jdk\jre\lib\ext\dnsns.jar;
D:\java\jdk\jdk 1.8\jdk\jre\lib\ext\jaccess.jar;
D:\java\jdk\jdk 1.8\jdk\jre\lib\ext\jfxrt.jar;
D:\java\jdk\jdk 1.8\jdk\jre\lib\ext\localedata.jar;
D:\java\jdk\jdk 1.8\jdk\jre\lib\ext\nashorn.jar;
D:\java\jdk\jdk 1.8\jdk\jre\lib\ext\sunec.jar;
D:\java\jdk\jdk 1.8\jdk\jre\lib\ext\sunjce_provider.jar;
D:\java\jdk\jdk 1.8\jdk\jre\lib\ext\sunmscapi.jar;
D:\java\jdk\jdk 1.8\jdk\jre\lib\ext\sunpkcs11.jar;
D:\java\jdk\jdk 1.8\jdk\jre\lib\ext\zipfs.jar;
D:\java\jdk\jdk 1.8\jdk\jre\lib\javaws.jar;
D:\java\jdk\jdk 1.8\jdk\jre\lib\jce.jar;
D:\java\jdk\jdk 1.8\jdk\jre\lib\jfr.jar;
D:\java\jdk\jdk 1.8\jdk\jre\lib\jfxswt.jar;
D:\java\jdk\jdk 1.8\jdk\jre\lib\jsse.jar;
D:\java\jdk\jdk 1.8\jdk\jre\lib\management-agent.jar;
D:\java\jdk\jdk 1.8\jdk\jre\lib\plugin.jar;
D:\java\jdk\jdk 1.8\jdk\jre\lib\resources.jar;
D:\java\jdk\jdk 1.8\jdk\jre\lib\rt.jar; //rt.jar
E:\ideaIC_workspaces\javaSE\out\production\javaSE; //我們自己類的
D:\software\idea\ideaIC\IntelliJ IDEA Community Edition
2021.2.3\lib\idea_rt.jar
*/
System.out.println(System.getProperty("java.class.path"));
}
}