動態代理入門演示
阿新 • • 發佈:2018-02-10
pre www test 運行 創建 獲得 -m pac style
1 接口代碼
package www.test.proxy; public interface TargetInterface { public void method1(); public String method2(); public int method3(int x); }
2 實現接口類的代碼
package www.test.proxy; public class Target implements TargetInterface { @Override public void method1() { System.out.println("method1 running.........."); } @Override public String method2() { System.out.println("method2 running..........."); return "method2"; } @Override public int method3(int x) { return x ; } }
3 動態代理代碼演示1
package www.test.proxy;import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import org.junit.Test; public class ProxyTest { @Test public void test1(){ //獲得動態的代理對象----在運行時 在內存中動態的為 Target 創建一個虛擬的代理對象 //objProxy 是代理對象 根據參數確定到底是誰的代理對象 TargetInterface objProxy = (TargetInterface) Proxy.newProxyInstance(//loader :與目標對象相同的類加載器 Target.class.getClassLoader(), // interfaces :代表與目標對象實現的所有接口字節碼對象數組 new Class[]{TargetInterface.class}, //h: 具體的操作,InvocationHandler接口 new InvocationHandler() { //invoke 代表的是執行代理對象的方法 //method: 代表目標對象的方法字節碼對象 //args:代表目標對象的相應的方法的參數 @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("目標方法前的邏輯"); //執行目標對象的方法 Object invoke = method.invoke(new Target(), args); System.out.println("目標方法後的邏輯"); return invoke; } }); objProxy.method1(); String method2 = objProxy.method2(); System.out.println(method2); int method3 = objProxy.method3(18); System.out.println(method3); } }
4 動態代理演示代碼2
package www.test.proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import org.junit.Test; public class ProxyTest2 { @Test public void test1(){ final Target target = new Target(); //動態創建代理對象 TargetInterface proxy = (TargetInterface) Proxy.newProxyInstance( //Proxy.newProxyInstance(loader, interfaces, h) //loader: 代表與目標對象相同的類加載器 target.getClass().getClassLoader(), // interfaces :代表與目標對象實現的所有接口字節碼對象數組 target.getClass().getInterfaces(), //返回值為字節碼對象數組 // h : 具體的操作,InvocationHandler接口 new InvocationHandler() { @Override //被執行幾次? ------- 看代理對象調用方法幾次 //代理對象調用接口相應方法 都是調用 invoke /* * proxy:是代理對象 * method:代表的是目標方法的字節碼對象 * args:代表是調用目標方法時參數 */ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //反射知識點 Object invoke = method.invoke(target, args);//目標對象的相應方法 //retrun 返回的值給代理對象 return invoke; } }); //調用 invoke---Method: 目標對象的 method1 方法 args: null 返回值 null proxy.method1(); //調用 invoke---Method:目標對象的 method2 方法 args:null 返回值 method2 String method2 = proxy.method2(); //調用 invoke-----Method:目標對象的 method3 方法 args:Object[]{100} 返回值 100 int method3 = proxy.method3(100); System.out.println(method2); System.out.println(method3); } }
動態代理入門演示