日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Aop动态代理解决问题

發布時間:2024/4/13 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Aop动态代理解决问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

使用動態代理解決上述問題

代理設計模式的原理: 使用一個代理將對象包裝起來, 然后用該代理對象取代原始對象. 任何對原始對象的調用都要通過代理. 代理對象決定是否以及何時將方法調用轉到原始對象上.

package com.learn.spring.aop;public interface ArithmeticCalculator {public int add(int i, int j );public int sub(int i, int j );public int mul(int i, int j );public int div(int i, int j ); }

?

package com.learn.spring.aop;public class ArithmeticCalculatorImpl implements ArithmeticCalculator {@Overridepublic int add(int i, int j) {int result = i + j ;return result;}@Overridepublic int sub(int i, int j) {int result = i - j ;return result; }@Overridepublic int mul(int i, int j) {int result = i * j ;return result;}@Overridepublic int div(int i, int j) {int result = i / j ;return result;}} package com.learn.spring.aop;public class ArithmeticCalculatorLoggingImpl implements ArithmeticCalculator {@Overridepublic int add(int i, int j) {//System.out.println("learn==>The method add begins with ["+i+","+j+"]");int result = i + j ;//System.out.println("learn==>The method add ends with "+ result );return result;}@Overridepublic int sub(int i, int j) {System.out.println("learn==>The method sub begins with ["+i+","+j+"]");int result = i - j ;System.out.println("learn==>The method sub ends with "+ result );return result; }@Overridepublic int mul(int i, int j) {System.out.println("learn==>The method mul begins with ["+i+","+j+"]");int result = i * j ;System.out.println("learn==>The method mul ends with "+ result );return result;}@Overridepublic int div(int i, int j) {System.out.println("learn==>The method div begins with ["+i+","+j+"]");int result = i / j ;System.out.println("learn==>The method div ends with "+ result );return result;}} package com.learn.spring.aop;import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.util.Arrays;//代理類 public class ArithmeticCalculatorLoggingProxy {//1.被代理的對象 目標對象private ArithmeticCalculator target ; // 實際上是ArithmeticCalculatorImpl對象.//通過構造器的方式將目標對象傳入public ArithmeticCalculatorLoggingProxy(ArithmeticCalculator target){this.target = target ;}//獲取代理對象public ArithmeticCalculator getLoggingProxy(){//定義代理對象ArithmeticCalculator proxy ;/*** loader: ClassLoader 類加載器* interfaces: 目標類的所有接口,目的是獲取接口中的方法* h: InvocationHandler*/ClassLoader loader = target.getClass().getClassLoader();Class[] interfaces = target.getClass().getInterfaces();InvocationHandler h = new InvocationHandler() {/*** proxy:代理對象 在invoke方法中一般不會用* method:正在調用的方法* args:調用方法傳入的參數*/@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {String methodName = method.getName();//加日志System.out.println("learn===>The method "+methodName+" begins with "+ Arrays.asList(args));//執行目標方法Object result = method.invoke(target, args);//加日志System.out.println("learn===>The method "+methodName+" ends with " + result );return result;}};proxy = (ArithmeticCalculator)Proxy.newProxyInstance(loader, interfaces, h);return proxy ;}} package com.learn.spring.aop;public class Main {public static void main(String[] args) {//目標對象ArithmeticCalculator target = new ArithmeticCalculatorImpl();//獲取代理對象ArithmeticCalculator proxy = new ArithmeticCalculatorLoggingProxy(target).getLoggingProxy();System.out.println("proxy:" + proxy.getClass().getName());int result = proxy.add(1, 1); // 實際上要去執行invoke方法System.out.println("result=====>"+result);} }

?

總結

以上是生活随笔為你收集整理的Aop动态代理解决问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。