1. 程式人生 > >Java 類的載入過程和類的載入器ClassLoader

Java 類的載入過程和類的載入器ClassLoader

Java 類的載入過程和類的載入器ClassLoader

1. 類的載入

當程式主動使用某個類時,如果該類還未被載入到記憶體中,則系統會通過如下三個步驟來對該類進行初始化。
載入過程
載入
我們建立了一個類,通過編譯(javac.exe),生成對應的.class檔案,我們建立了一個類,通過編譯(java.exe),生成對應的.class檔案,此.class檔案載入到記憶體以後,就是一個執行時類,存在在快取區.

2. 類的載入器ClassLoader

  1. 類載入器是用來把類(class)裝載進記憶體的。JVM 規範定義了兩種型別的類載入器:啟動類載入器(bootstrap)和使用者自定義載入器(user-defined class loader)。 JVM在執行時會產生3個類載入器組成的初始化載入器層次結構 ,如下圖所示:
    類的載入器
  2. dome
	//關於類的載入器:ClassLoader
	@Test
	public void test5() throws Exception {
		//1.獲取一個系統類載入器
		ClassLoader loader1 = ClassLoader.getSystemClassLoader();
		System.out.println(loader1);//[email protected]
		//2.獲取系統類載入器的父類載入器,即擴充套件類載入器
		ClassLoader loader2 = loader1.getParent();
		System.out.println(loader2);//
[email protected]
//3.獲取擴充套件類載入器的父類載入器,即引導類載入器 ClassLoader loader3 = loader2.getParent(); System.out.println(loader3);//引導類載入器,null,不能直接獲取 //4.測試當前類由哪個類載入器進行載入 Class clazz1 = Person.class; ClassLoader loader4 = clazz1.getClassLoader(); System.out.println(loader4);//系統載入器載入的 //5.測試JDK提供的Object類由哪個類載入器載入 String className = "java.lang.Object"; Class clazz2 = Class.forName(className); ClassLoader loader5 = clazz2.getClassLoader(); System.out.println(loader5);//引導類載入,獲取獲取不到,因為他們屬於核心類 //*6.關於類載入器的一個主要方法:getResourceAsStream(String str):獲取類路徑下的指定檔案的輸入流 //方法一:配置檔案 ClassLoader loader = this.getClass().getClassLoader(); InputStream is = loader.getResourceAsStream("testReflection");//路徑 Properties pros = new Properties(); pros.load(is); String name = pros.getProperty("user"); String password = pros.getProperty("password"); System.out.println(name+" "+ password); //方法二: // FileInputStream is = new FileInputStream(new File("")); }