1 package com.proxy.daili; 2 3 import com.proxy.daili.service.IModelMath; 4 5 import java.lang.reflect.InvocationHandler; 6 import java.lang.reflect.Method; 7 import java.lang.reflect.Proxy; 8 import java.util.Arrays; 9 10 /** 11 * 動態代理模式類 12 * 第一種代理模式:Jdk動態代理 13 * 注意:實現InvocationHandler這個接口 14 * 15 * 基於接口的 16 */ 17 public class JdkDynamicProxy implements InvocationHandler { 18 19 //定義須要代理的接口 20 protected IModelMath iModelMath; 21 22 //將須要代理的接口做爲參數傳入到動態代理設計模式類中 23 public JdkDynamicProxy(IModelMath iModelMath){ 24 this.iModelMath = iModelMath; 25 } 26 27 /** 28 * 生成代理對象 29 * 使用java.lang.reflect.Proxy這個類調用newProxyInstance方法 30 * 返回 動態代理類對象 31 */ 32 public IModelMath iModelMathmethod(){ 33 IModelMath iModelMathProxy = (IModelMath) Proxy.newProxyInstance(iModelMath.getClass().getClassLoader(), 34 iModelMath.getClass().getInterfaces(), 35 this); 36 return iModelMathProxy; 37 } 38 39 /** 40 * 開始作代理的操做 41 * Object proxy 代理對象的引用 42 * Method method 當前執行的方法 43 * Object[] args 當前執行方法的參數 44 * 返回 與被代理對象返回的值相同 45 */ 46 @Override 47 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 48 System.out.println("你調用的方法爲:"+method.getName()); 49 System.out.println("你調用的方法參數有:"+ Arrays.toString(args)); 50 Object invoke = method.invoke(iModelMath, args); 51 System.out.println("方法的返回數據:"+invoke); 52 return invoke; 53 } 54 55 }
1 package com.proxy.test; 2 3 import com.proxy.daili.service.IModelMath; 4 import com.proxy.daili.JdkDynamicProxy; 5 import com.proxy.daili.service.ModelMath; 6 import org.junit.Test; 7 8 public class TestJDKDynamicProxy { 9 10 /** 11 * 使用jdk方式的動態代理 12 * 測試 13 */ 14 @Test 15 public void testJdkDynamicProxy(){ 16 //須要被代理的動態對象 17 IModelMath imm = new ModelMath(); 18 //代理對象 19 IModelMath math = new JdkDynamicProxy(imm).iModelMathmethod(); 20 //經過代理對象作操做 21 int addition = math.addition(10, 2); 22 int subtraction = math.subtraction(20, 19); 23 System.out.println("實際方法的數據爲:"+addition); 24 System.out.println("實際方法的數據爲:"+subtraction); 25 } 26 }
1 package com.proxy.daili; 2 3 import com.proxy.daili.service.IModelMath; 4 import com.proxy.daili.service.ModelMath; 5 import net.sf.cglib.proxy.Enhancer; 6 import net.sf.cglib.proxy.MethodInterceptor; 7 import net.sf.cglib.proxy.MethodProxy; 8 9 import java.lang.reflect.Method; 10 import java.util.Arrays; 11 12 /** 13 * cglib動態代理設計類 14 * 前提必需要先導入 cglib 包 15 * 基於 實現類的 16 */ 17 public class CglibDynamicProxy implements MethodInterceptor { 18 19 //定義被代理的實現類(注意這 是實現類,不是接口) 20 private ModelMath modelMath; 21 22 //將被代理的對象做爲參數 傳入到 cglib動態代理設計類中 23 public CglibDynamicProxy(ModelMath modelMath){ 24 this.modelMath = modelMath; 25 } 26 27 //生成代理對象 28 public ModelMath getProxyModelMath(){ 29 //new 一個Enhancer對象 30 Enhancer enhancer = new Enhancer(); 31 //指定他的父類(注意這 是實現類,不是接口) 32 enhancer.setSuperclass(ModelMath.class); 33 //指定真正作事情的回調方法 34 enhancer.setCallback(this); 35 //生成代理類對象 36 ModelMath o = (ModelMath) enhancer.create(); 37 //返回 38 return o; 39 } 40 41 /** 42 * 執行被代理的任何方法,都會通過這個方法 43 * @param o 44 * @param method 45 * @param objects 46 * @param methodProxy 47 * @return 48 * @throws Throwable 49 */ 50 @Override 51 public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { 52 System.out.println("經過gclib 動態代理調用的方法名爲:"+method.getName()); 53 System.out.println("經過gclib 動態代理調用的方法的參數包含:"+ Arrays.toString(objects)); 54 Object invoke = method.invoke(modelMath, objects); 55 System.out.println("經過gclib 動態代理調用的方法返回的數據:"+ invoke); 56 return invoke; 57 } 58 }
1 package com.proxy.test; 2 3 import com.proxy.daili.CglibDynamicProxy; 4 import com.proxy.daili.service.ModelMath; 5 import org.junit.Test; 6 7 public class TestCgLibDynamicProxy { 8 /** 9 * 使用gclib方式的動態代理 10 * 測試 11 */ 12 @Test 13 public void testCglibDynamicProxy(){ 14 ModelMath modelMath = new ModelMath(); 15 ModelMath proxyModelMath = new CglibDynamicProxy(modelMath).getProxyModelMath(); 16 int subtraction = proxyModelMath.subtraction(1, 44); 17 int addition = proxyModelMath.addition(10, -1); 18 System.out.println("執行減法獲得的正式數據爲:"+subtraction); 19 System.out.println("執行加法獲得的正式數據爲:"+addition); 20 } 21 }