動態代理
代理模式是 Java 中的常用設計模式,代理類通過調用被代理類的相關方法,提供預處理、過濾、事後處理等服務,動態代理及通過反射機制動態實現代理機制。JDK 中的 java.lang.reflect.Proxy 類可以用來實現動態代理。
首先,准備一個簡單的接口和實現類
/**
* 接口 IHello.java
*/
public interface IHello {
void hello();
}
/**
* 實現類 Hello.java
*/
public class Hello implements IHello {
@Override
public void hello() {
System.out.println("我是Hello.");
}
}
通過 Proxy 實現動態代理
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import org.junit.Test;
public class HelloTest {
@Test
public void testProxy() throws Exception {
final IHello hello = new Hello();
/*
* proxyHello : 代理主題角色,代理類的實例
* IHello : 抽象主題角色,代理類和被代理類都需要實現的接口,JDK中的動態代理必須針對接口
* hello : 真實主題角色,被代理類的實例
*/
IHello proxyHello = (IHello) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),
new Class[] { IHello.class }, new InvocationHandler() {
/*
* proxy : 當前代理類的一個實例; 若調用proxy的非final方法,將造成無限循環調用
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 前期的業務邏輯操作
System.out.println("---開始");
// 調用被代理類的方法,傳入參數args,得到返回
Object object = method.invoke(hello, args);
// 後期的業務邏輯操作
System.out.println("---結束");
return object;
}
});
proxyHello.hello();
}
}
