Java 如何實(shí)現(xiàn)動(dòng)態(tài)代理?
動(dòng)態(tài)代理是一種運(yùn)行時(shí)生成代理類的機(jī)制,能夠在代理類中處理被代理類的方法調(diào)用。Java中的動(dòng)態(tài)代理主要通過 java.lang.reflect 包中的 Proxy 類和 InvocationHandler 接口來實(shí)現(xiàn)。
首先,我們需要編寫一個(gè) InvocationHandler 接口的實(shí)現(xiàn)類來實(shí)現(xiàn)具體的代理邏輯。以下是一個(gè)簡(jiǎn)單的例子:
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class MyInvocationHandler implements InvocationHandler {
??? private Object target;
??? public MyInvocationHandler(Object target) {
??????? this.target = target;
??? }
??? @Override
??? public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
??????? System.out.println("Before invoking " + method.getName());
??????? Object result = method.invoke(target, args);
??????? System.out.println("After invoking " + method.getName());
??????? return result;
??? }
}
這里的 MyInvocationHandler 類實(shí)現(xiàn)了 InvocationHandler 接口,并通過構(gòu)造函數(shù)傳入一個(gè)被代理對(duì)象。在 invoke 方法中,我們可以對(duì)被代理對(duì)象的方法調(diào)用進(jìn)行處理。
接下來,我們可以使用 Proxy 類來生成代理對(duì)象。以下是一個(gè)示例:
import java.lang.reflect.Proxy;
public class Main {
??? public static void main(String[] args) {
??????? // 創(chuàng)建被代理對(duì)象
??????? RealSubject realSubject = new RealSubject();
??????? // 創(chuàng)建代理對(duì)象
??????? MyInvocationHandler handler = new MyInvocationHandler(realSubject);
??????? Subject proxy = (Subject) Proxy.newProxyInstance(RealSubject.class.getClassLoader(),
??????????????? RealSubject.class.getInterfaces(),
??????????????? handler);
??????? // 調(diào)用代理對(duì)象的方法
??????? proxy.request();
??? }
}
這里,我們使用 Proxy.newProxyInstance 方法創(chuàng)建代理對(duì)象,傳入類加載器、被代理對(duì)象實(shí)現(xiàn)的接口以及實(shí)現(xiàn)了 InvocationHandler 接口的 MyInvocationHandler 對(duì)象。最后,我們調(diào)用代理對(duì)象的方法來觸發(fā)代理邏輯。
總之,Java中實(shí)現(xiàn)動(dòng)態(tài)代理的方式是使用 Proxy 類和 InvocationHandler 接口來生成代理類,并通過代理類來處理被代理對(duì)象的方法調(diào)用。