Java動態代理的應用
阿新 • • 發佈:2019-02-08
先看一下代理模式,類圖(如果要深究java代理是模式,設計的原理比較複雜,建議參考相關書籍和文章,這裡不展開闡述)
代理模式最大的特點就是代理類和實際業務類實現同一個介面(或繼承同一父類),代理物件持有一個實際物件的引用,外部呼叫時操作的是代理物件,而在代理物件的內部實現中又會去呼叫實際物件的操作
Java動態代理其實內部也是通過Java反射機制來實現的,即已知的一個物件,然後在執行時動態呼叫其方法,這樣在呼叫前後作一些相應的處理,這樣說的比較籠統,舉個簡單的例子
比如我們在應用中有這樣一個需求,在對某個類的一個方法的呼叫前和呼叫後都要做一下日誌操作,
一個普通的介面
- publicinterface AppService {
- publicboolean createApp(String name);
- }
該介面的預設實現類
- publicclass AppServiceImpl implements AppService {
- publicboolean createApp(String name) {
- System.out.println("App["+name+"] has been created.");
- returntrue;
- }
- }
日誌處理器
- publicclass 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
- 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;
- }
- }
外部呼叫
- publicclass Main {
- publicstaticvoid 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");
- }
- }