詳解java動態代理模式
阿新 • • 發佈:2018-12-23
引言:java框架中很多設計都是基於動態代理模式的,所謂動態代理模式,就是動態的產生目標物件的代理類,並規定一個方法,可以執行目標物件的方法,也可以在目標物件方法的基礎上新增其他必要的方法。這裡,詳細介紹一下java中實現動態代理模式的兩種方式
在java中,動態代理模式的實現有兩種方式:
- 一種是基於JDK的方式
基於JDK內建的實現方式要求目標物件(被代理物件)必須有介面,因為其是根據目標物件的介面來動態生成代理物件的。
具體的步驟如下:
- 宣告一個類並實現InvocationHandler介面,在此類中指定目標物件,並指定代理行為
public class ComputerInvocationHandler implements InvocationHandler {
//指定代理物件,可以傳入一切代理物件,代理物件是以介面的形式表示
private Object target;
public ComputerInvocationHandler(Object object) {
this.target = object;
}
/**
* 指定代理行為
* @param proxy
* @param method
* @param args
* @return
* @throws Throwable
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object res = method.invoke(target,args);
return res;
}
}
2. 在另外一個類中(例如測試類) 建立一個目標物件
//建立目標物件 自然是有一個Lenovo類,類中有一些自帶的方法
Lenovo lenovo = new Lenovo();
3. 建立Invocation物件
//Handler物件
ComputerInvocationHandler computerInvocationHandler = new ComputerInvocationHandler(lenovo);//這裡是建立Handler物件,其構造方法中需要傳被代理物件
4. 呼叫Proxy的newProxyInstance方法獲取代理物件
//介面指向實現類
Computer computer = (Computer) Proxy.newProxyInstance(lenovo.getClass().getClassLoader(),lenovo.getClass().getInterfaces(),computerInvocationHandler);
5. 使用代理物件呼叫目標物件的方法
computer.sales();//computer中自帶有sales方法
二是基於CGlib的
- 基於CGlib的實現方式不要求目標物件有介面,但是需要根據目標物件產生一個子類作為代理物件
實現步驟:
- 新增cglib的maven依賴
<dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>3.2.5</version> </dependency>
2.建立一個類,並實現methodInterceptor介面,在此類中指定代理行為
- 基於CGlib的實現方式不要求目標物件有介面,但是需要根據目標物件產生一個子類作為代理物件
public class MyMethodInterceptor implements MethodInterceptor {
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
return methodProxy.invokeSuper(o,objects);
}
}
3.在需要代理的地方(例如測試類)中建立Enhance物件
Enhancer enhancer = new Enhancer();
4.指定父類物件(即目標物件)
//設定目標物件(父類)
enhancer.setSuperclass(Mouse.class);
5.指定代理行為(MethodInterceptor的實現類)
//設定代理行為
enhancer.setCallback(new MyMethodInterceptor());
6.建立實現類(目標物件的子類),執行方法
Mouse mouse = (Mouse) enhancer.create();
mouse.move();
總結:以上詳細介紹了java種兩種實現動態代理模式的方式及實現步驟希望對初學者有所幫助,關於設計模式,以後要多寫部落格,多做總結才行