Java动态代理的应用
?先看一下代理模式,這個應(yīng)該是設(shè)計模式中最簡單的一個了,類圖
??代理模式最大的特點就是代理類和實際業(yè)務(wù)類實現(xiàn)同一個接口(或繼承同一父類),代理對象持有一個實際對象的引用,外部調(diào)用時操作的是代理對象,而在代理對象的內(nèi)部實現(xiàn)中又會去調(diào)用實際對象的操作
?Java動態(tài)代理其實內(nèi)部也是通過Java反射機(jī)制來實現(xiàn)的,即已知的一個對象,然后在運行時動態(tài)調(diào)用其方法,這樣在調(diào)用前后作一些相應(yīng)的處理,這樣說的比較籠統(tǒng),舉個簡單的例子
?? 比如我們在應(yīng)用中有這樣一個需求,在對某個類的一個方法的調(diào)用前和調(diào)用后都要做一下日志操作,
一個普通的接口
public interface AppService { public boolean createApp(String name); }?
該接口的默認(rèn)實現(xiàn)類
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 {//注意實現(xiàn)這個Handler接口 private Object target;//目標(biāo)對象的引用,這里設(shè)計成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);//調(diào)用目標(biāo)對象的方法 System.out.println("Before return:"+result); return result; } }
外部調(diào)用
public class Main { public static void main(String[] args) { AppService target = new AppServiceImpl();//生成目標(biāo)對象 //接下來創(chuàng)建代理對象 AppService proxy = (AppService) Proxy.newProxyInstance( target.getClass().getClassLoader(), target.getClass().getInterfaces(), new LoggerInterceptor(target)); proxy.createApp("Kevin Test"); } }?
?
總結(jié)
以上是生活随笔為你收集整理的Java动态代理的应用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 设置文本及背景颜色
- 下一篇: Java JDK 学习笔记:File类