1.類加載器的工作機制
(1)裝載,將二進制類文件導入
(2)鏈接,對二進制文件執行校驗,準備和解析
(3)初始化,對類的靜態變量和靜態代碼塊進行初始化.
JVM在運行的時候會出現3個類加載器:根裝載器,ExtClassLoader(擴展類裝載器),AppClassLoader(應用類裝載器),其中根裝載器不是ClassLoader的子類,它是使用c++編寫,所以在java中看不到它,其中 跟裝載器負責JRE的核心類庫,如rt.jar,charsets.jar等, ExtClassLoader負責裝載JRE擴展目錄ext中的JAR類包,AppClassLoader負責加載ClassPath下的類包
通過如下代碼,可以看到各個類加載器,其中根加載器是在c++中編寫,所以在java中看不到,因此返回null
package com.smart.reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
public class CarReflect {
public static Car initByDefaultConst() throws Throwable {
//通過類加載器,獲取car的類對象
ClassLoader loader = Thread.currentThread().getContextClassLoader();
Class<Car> carClass = (Class<Car>) loader.loadClass("com.smart.reflect.Car");
//2.獲取類的構造器對象並通過實例化Car
Constructor<Car> cons = carClass.getDeclaredConstructor((Class[])null);
Car car = cons.newInstance();
//3.通過反射設置屬性
Method setBrand = carClass.getMethod("setBrand", String.class);
setBrand.invoke(car, "brand");
return car;
}
public static void main(String[] args) throws Throwable {
/*Car car = CarReflect.initByDefaultConst();
car.introduce();
System.out.println(car.getBrand());*/
//裝載,連接,初始化
ClassLoader loader = Thread.currentThread().getContextClassLoader();
System.out.println(loader);
System.out.println(loader.getParent());
System.out.println(loader.getParent().getParent());
}
}
2.類加載器中的方法
(1) Constructor:類的構造函數反射類,通過"ClassLoader".getDeclaredContructor()獲取
(2)Method:類方法的反射類,通過"ClassLoader".getMethod獲取
(3)Field:類的成員變量的反射類,通過"ClassLoader".getField獲取
其它方法省略