Java 反射機制

直接上碼使用方式:

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裝載。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容