1. 程式人生 > 其它 >Java之動態代理

Java之動態代理

動態代理

可以簡單理解成代理商經營模式。代理物件對真實的物件進行動態代理,我們的需求本來是需要訪問真實的物件才可以完成,如果存在代理物件,那麼我們也可以將需求發給代理物件,代理物件去呼叫真正的物件也可完成我們的需求。

動態代理的幾個概念

1、真實物件:被代理的物件

2、代理物件

3、代理模式:代理物件代理真實物件,達到一種增強真實物件功能的目的

靜態代理:有一個java類檔案來描述代理模式

動態代理:在記憶體中形成代理類

實現動態代理的流程

1、代理物件和真實物件實現相同介面

2、Proxy.newinstance獲取代理物件

3、使用代理物件呼叫方法(因為實現了相同的介面,所以會實現相同的方法)

Proxy.newProxyInstance()

Proxy.newProxyInstance()會返回一個代理物件

Proxy.newProxyInstance()會返回一個代理物件
該方法有三個引數
1、類載入器:真實物件.getClass().getClassLoader()
2、實現的介面:真實物件.getClass().getInterfaces()
3、處理器:new InvocationHandler()

@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { return null; }

invoke方法

處理代理邏輯的方法:代理物件呼叫的所有方法的執行都會觸發該方法執行

​ 引數:
​ 1、proxy 代理物件
​ 2、method:代理物件呼叫的方法,會被封裝成Method類的method物件傳入invoke方法中
​ 3、args:代理物件呼叫方法時,傳遞到該方法內的實際引數

例子:

介面

public interface SaleComputer {
    public String Sale(double money);

    public void show();
}

真實物件類

public class Lenovo implements SaleComputer{
    @Override
    public String Sale(double money) {
        System.out.println("花了" + money +  "元買了一臺Lenovo電腦");
        return "Lenovo Computer";
    }

    @Override
    public void show() {
        System.out.println("展示電腦...");
    }
}

動態代理實現類

public class ProxyTest {
    public static void main(String[] args) {

        //動態代理真實物件
        /*
            Proxy.newProxyInstance()會返回一個代理物件
            該方法有三個引數
            1、類載入器:真實物件.getClass().getClassLoader()
            2、實現的介面:真實物件.getClass().getInterfaces()
            3、處理器:new InvocationHandler()
         */
        SaleComputer proxy = (SaleComputer) Proxy.newProxyInstance(lenovo.getClass().getClassLoader(), lenovo.getClass().getInterfaces(), new InvocationHandler() {

            //代理邏輯的方法:代理物件呼叫的所有方法的執行都會觸發該方法執行
            /*
            引數:
            1、proxy 代理物件
            2、method:代理物件呼叫的方法,會被封裝成Method類的method物件傳入invoke方法中
            3、args:代理物件呼叫方法時,傳遞到該方法內的實際引數
             */
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("代理方法執行了");
                System.out.println(method);
                System.out.println(args[0]);


                return null;
            }
        });

        //呼叫方法
        String computer = proxy.Sale(8000);
     		System.out.println(computer);        
    }

}

總結

動態代理其實就是一種設計模式,為了達到增強物件功能的目的。

在安全中,比如cc鏈也會經常用到動態代理的特性,即代理物件呼叫的所有方法的執行都會觸發處理器Invoke方法的執行

所有內容僅限於維護網路安全學習參考