JDK 動態代理基於介面,通過 java.lang.reflect.Proxy 在運行時生成代理類,核心三要素:
IHello(代理與被代理共同實現)Hello 實例public static Object newProxyInstance(
ClassLoader loader, // 類加載器
Class>[] interfaces, // 實現的介面列表
InvocationHandler h // 攔截處理器
) throws IllegalArgumentException
public interface IHello { void hello(); }
public class Hello implements IHello {
public void hello() { System.out.println("我是 Hello"); }
}
public class HelloTest {
@Test public void testProxy() {
IHello target = new Hello();
IHello proxy = (IHello) Proxy.newProxyInstance(
Thread.currentThread().getContextClassLoader(),
new Class[] { IHello.class },
new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("--- 開始 ---");
Object result = method.invoke(target, args); // 調用目標
System.out.println("--- 結束 ---");
return result;
}
}
);
proxy.hello(); // 輸出:開始 → 我是 Hello → 結束
}
}
invoke 中調用 proxy.xxx() 會無限遞歸,必須調用 target.xxx() 或 method.invoke(target, args)Proxy 實現目標介面,toString()/equals()/hashCode() 會被攔截com.sun.proxy.$Proxy0