Java动态代理的应用
?先看一下代理模式,這個應該是設計模式中最簡單的一個了,類圖
??代理模式最大的特點就是代理類和實際業務類實現同一個接口(或繼承同一父類),代理對象持有一個實際對象的引用,外部調用時操作的是代理對象,而在代理對象的內部實現中又會去調用實際對象的操作
?Java動態代理其實內部也是通過Java反射機制來實現的,即已知的一個對象,然后在運行時動態調用其方法,這樣在調用前后作一些相應的處理,這樣說的比較籠統,舉個簡單的例子
?? 比如我們在應用中有這樣一個需求,在對某個類的一個方法的調用前和調用后都要做一下日志操作,
一個普通的接口
public interface AppService { public boolean createApp(String name); }?
該接口的默認實現類
public class AppServiceImpl implements AppService { public boolean createApp(String name) { System.out.println("App["+name+"] has been created."); return true; } }?
日志處理器
public class LoggerInterceptor implements InvocationHandler {//注意實現這個Handler接口 private Object target;//目標對象的引用,這里設計成Object類型,更具通用性 public LoggerInterceptor(Object target){ this.target = target; } public Object invoke(Object proxy, Method method, Object[] arg) throws Throwable { System.out.println("Entered "+target.getClass().getName()+"-"+method.getName()+",with arguments{"+arg[0]+"}"); Object result = method.invoke(target, arg);//調用目標對象的方法 System.out.println("Before return:"+result); return result; } }
外部調用
public class Main { public static void main(String[] args) { AppService target = new AppServiceImpl();//生成目標對象 //接下來創建代理對象 AppService proxy = (AppService) Proxy.newProxyInstance( target.getClass().getClassLoader(), target.getClass().getInterfaces(), new LoggerInterceptor(target)); proxy.createApp("Kevin Test"); } }?
?
總結
以上是生活随笔為你收集整理的Java动态代理的应用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 设置文本及背景颜色
- 下一篇: 什么防盗门都是浮云~