1. 程式人生 > >動態代理入門演示

動態代理入門演示

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);
        
    }
}

動態代理入門演示