反射是 Java 動態性的基石,框架開發、動態代理、熱加載無不依賴它。本文通過 15+ 實戰案例,系統講解反射核心 API、類生命週期、動態代理與工廠模式應用。
obj.getClass().getName()Class.forName()、obj.getClass()、ClassName.classclazz.newInstance()、有參構造器 constructor.newInstance(args)method.invoke(obj, args)field.setAccessible(true)Array.get/set、動態擴容Proxy.newProxyInstance + InvocationHandlerif-else,支援屬性文件配置static { /* 類載入時執行一次 */ }
{ /* 每次實例化前執行 */ }
public interface Subject { String say(String name, int age); }
public class RealSubject implements Subject { ... }
public class MyInvocationHandler implements InvocationHandler {
private Object target;
public Object bind(Object target) {
this.target = target;
return Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
this
);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 前置增強
Object result = method.invoke(target, args);
// 後置增強
return result;
}
}
應用:Spring AOP、RPC 框架、事務管理。
傳統工廠需修改代碼新增產品;反射版只需配置類名:
public class Factory {
public static Fruit getInstance(String className) {
try {
return (Fruit) Class.forName(className).newInstance();
} catch (Exception e) { return null; }
}
}
進階:結合 Properties 配置文件,實現零代碼修改擴展。
java.lang.Class 對象。Method/Constructor/Field。setAccessible(true) 可能被 SecurityManager 禁止。opens 宣告。反射賦予 Java 動態靈魂,掌握其核心 API、初始化順序、動態代理與類載入機制,是進階框架開發、源碼閱讀、疑難排查的必備內功。