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
clazz.newInstance():調用無參建構子(已棄用,建議用 getDeclaredConstructor().newInstance())。getConstructor(Class...):取得 public 建構子;私有建構子用 getDeclaredConstructor() + setAccessible(true)。getMethod(name, paramTypes):取得 public 方法(含繼承);私有方法用 getDeclaredMethod()。method.invoke(obj, args):動態調用,自動處理拆箱/裝箱。反射比直接調用慢(JIT 難優化、存取檢查開銷)。熱點路徑可用 MethodHandle 或字節碼生成(ASM、ByteBuddy)優化。