Java之動態代理
阿新 • • 發佈:2021-07-29
動態代理
可以簡單理解成代理商經營模式。代理物件對真實的物件進行動態代理,我們的需求本來是需要訪問真實的物件才可以完成,如果存在代理物件,那麼我們也可以將需求發給代理物件,代理物件去呼叫真正的物件也可完成我們的需求。
動態代理的幾個概念
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方法的執行。
所有內容僅限於維護網路安全學習參考