首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java 反射機制實戰:動態載入類、建立實例與調用方法

     編輯:Java 綜合教學

反射核心 API

java.lang.reflect 套件提供運行時檢查/操作類的能力:Class、Constructor、Method、Field。

待載入目標類

package eg.fortest;

public class WaitingforLoader {
    private String str;
    static { System.out.println("loading WaitingforLoader"); }

    public WaitingforLoader() {
        str = "empty";
        System.out.println("Constructor without args");
    }
    public WaitingforLoader(String str) {
        this.str = str;
        System.out.println("Constructor with " + str);
    }
    public void getStr(int i) { System.out.println("str=" + str); }
}

反射載入與操作示範

package factory.classfactory;

import java.lang.reflect.*;

public class LoadMyClass {
    public static void main(String[] args) throws Exception {
        System.out.println("Program start.");

        // 1. 載入類(觸發靜態初始化塊)
        Class<?> clazz = Class.forName("eg.fortest.WaitingforLoader");

        // 2. 建立實例:無參建構子
        Object myvar1 = clazz.newInstance();

        // 3. 建立實例:帶參建構子
        Constructor cor = clazz.getConstructor(String.class);
        Object myvar2 = cor.newInstance("string Parameter");

        // 4. 反射調用方法
        Method m = clazz.getMethod("getStr", int.class);
        m.invoke(myvar2, 1);
    }
}

執行輸出

Program start.
loading WaitingforLoader
Constructor of WaitingforLoader without anything.
Constructor of WaitingforLoader with string Parameter
str=string Parameter

關鍵流程解析

  1. Class.forName():觸發類載入、鏈接、初始化(執行 static 區塊)。
  2. clazz.newInstance():調用無參建構子(已棄用,建議用 getDeclaredConstructor().newInstance())。
  3. getConstructor(Class...):取得 public 建構子;私有建構子用 getDeclaredConstructor() + setAccessible(true)。
  4. getMethod(name, paramTypes):取得 public 方法(含繼承);私有方法用 getDeclaredMethod()。
  5. method.invoke(obj, args):動態調用,自動處理拆箱/裝箱。

實務應用場景

  • 框架掃描註解(Spring、MyBatis)
  • 插件系統動態載入
  • 序列化/反序列化庫
  • 測試框架自動發現測試方法

效能提示

反射比直接調用慢(JIT 難優化、存取檢查開銷)。熱點路徑可用 MethodHandle 或字節碼生成(ASM、ByteBuddy)優化。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved