直接上碼使用方式:
public class Car {
private String brand;
private String color;
private int maxSpeed;
public Car() {}
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public int getMaxSpeed() {
return maxSpeed;
}
public void setMaxSpeed(int maxSpeed) {
this.maxSpeed = maxSpeed;
}
public Car(String brand,String color,int maxSpeed){
this.brand = brand;
this.color = color;
this.maxSpeed = maxSpeed;
}
public void introduce(){
System.out.println("brand: " + brand + " color: " + color + " maxSpeed: " + maxSpeed);
}
}
public class ReflectTest {
public static Car initByDefaultConst() throws Throwable {
//通過類裝載器獲取Car類對象
ClassLoader classLoader = ClassLoader.getSystemClassLoader();
Class clazz = classLoader.loadClass("Car");
//找到默認構造函數并生成對象
Constructor constructor = clazz.getDeclaredConstructor((Class[]) null);
Car car = (Car) constructor.newInstance();
//通過反射方法設置屬性
Method setBrand = clazz.getMethod("setBrand",String.class);
setBrand.invoke(car,"Bens");
Method setColor = clazz.getMethod("setColor",String.class);
setColor.invoke(car,"Red");
Method setMaxSpeed = clazz.getMethod("setMaxSpeed",int.class);
setMaxSpeed.invoke(car,45);
return car;
}
public static void main(String[] args) throws Throwable{
initByDefaultConst().introduce();
}
}
類裝載器ClassLoader把類裝載進JVM需要經過以下步驟:
- 裝載:查找和導入類文件。
- 鏈接:執(zhí)行校驗、準備和解析。
- 校驗:檢測類數據是否正確。
- 準備:給類靜態(tài)變量分配空間。
- 解析:將符號引用改為直接引用。
- 初始化:對類的靜態(tài)變量和代碼執(zhí)行初始化工作。
JVM運行時會生成三個ClassLoader:根裝載器,ExClassLoader(拓展類裝載器)
、AppClassLoader(系統類裝載器),其中根裝載器是C++文件,AppClassLoader和ExClassLoader都是ClassLoader的子類,AppClassLoader是ExClassLoadee的子類。根裝載器負責裝載Jre核心類庫,ExClassLoader裝載jre拓展庫,AppClassLoader負責應用程序類。裝載順序是只有父ClassLoader找不到文件才到子ClassLoader裝載。