java-动态代理
在學習spring的AOP時候,動態代理那是必不可少的環節。
今天簡單介紹一下動態代理。
java動態代理是一種設計模式中代理模式的一種,幫助我們開發的一個工具吧。
*1.動態代理的優勢:*
降低各個功能模塊之間的耦合度,提高開發的效率和方便程序的維護度。
和aop的思想和切合。
減少代碼量。
對靜態代理有個了解的讀者可能就知道,靜態代理的代碼量比較龐大,所以動態代理是靜態代理的升華。
2.動態代理的實現方式
jdk自帶的動態代理主要是通過實現InvocationHandler
2.1 InvocationHandler的主要方法
Object invoke(Object proxy,
Method method,
Object[] args)
throws Throwable在代理實例上處理方法調用并返回結果。在與方法關聯的代理實例上調用方法時,將在調用處理程序上調用此方法。
2.2 方法詳細介紹
參數:
proxy - 調用方法的代理實例對象 method - 代理實例對象調用的接口方法的 Method 實例對象。
Method-對象的聲明類將是在其中聲明方法的接口,該接口可以是代理類賴以繼承方法的代理接口的超接口。
args -包含傳入代理實例上方法調用的參數值的對象數組,如果接口方法不使用參數,則為 null。返回:
從代理實例的方法調用返回的值。拋出: Throwable - 從代理實例上的方法調用拋出的異常。
3.具體登陸日志小案例(基于JDK動態代理)
3.1 業務接口 Login
public interface Login {public void login(String name); }3.2 業務實現類 LoginImpl
public class LoginImpl implements Login{@Overridepublic void login(String name) {System.out.println("welcome "+name+", login success !!1");} }3.3 代理類 LoginProxy
public class LoginProxy implements InvocationHandler {private Object target;public LoginProxy(Object target) {this.target = target;}public static Object init(Object Object){return Proxy.newProxyInstance(Object.getClass().getClassLoader(),Object.getClass().getInterfaces(),new LoginProxy(Object));}/*** 切入點 對所有對象的方法都進行調用* method.invoke方法對應代理對象調用login方法* @param proxy 代理對象* @param method 代理對象的方法* @param args 代理對象調用接口方法的參數值* @return 代理對象調用方法的返回值* @throws Throwable*/@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {login(method);Object invoke = method.invoke(target, args);loginout(method);return invoke;}//日志的方法public void log(String msg){System.out.println(msg);}//執行前日志public void login(Method method){log(method.getName()+"方法執行之前調用的信息");}//執行后日志public void loginout(Method method){log(method.getName()+"方法執行之后調用的信息");}}3.4 測試類 LoginClient
public class LoginClient {public static void main(String[] args) {Login login = (Login) LoginProxy.init(new LoginImpl());login.login("zhangsan");} }3.5 執行結果:
從上面的例子我們可以看到動態代理有效的減少了各個模塊的耦合度。
用于實現日志功能的代碼和用于實現登陸功能的代碼相互隔離。
只有在真正調用業務的時候并需要日志功能時候二者才發生聯系。
任何業務需要日志功能只需要通過代理類創建代理對象即可。
總結:
代理對象機制是一種非常實用的設計模式,有利于程序的開發效率以及對于程序的后期維護。不必在關系各個模塊之間的相互制約關系。
總結
- 上一篇: 只读文件系统
- 下一篇: GNU C中x++是原子操作吗?