java學習之動態代理
阿新 • • 發佈:2022-05-26
0x00動態代理
在後面的漏洞研究的學習中,必須要會的幾個知識點。反射機制和動態代理機制。至於反射的前面已經講到過了,這裡就不做更多的贅述了。反射是通過class檔案去獲取物件物件的方法.
動態代理是給目標物件提供一個代理物件,並由代理物件控制對目標物件的引用。
0x01動態代理的基礎
用途:我們使用動態代理的作用是在不改變物件的方法的前提下,增強物件的功能
- 真實物件:被代理的物件
- 代理物件:
- 代理模式:代理物件為真實物件,達到增強真實物件功能的目的
實現的方式:
- 靜態代理:有一個類檔案描述代理模式,類似於中介
- 動態代理:在記憶體中形成代理
0x02實現的步驟
-
代理物件和真實物件要實現相同的介面
-
代理物件=proxy.newInstance();
-
使用代理物件呼叫方法
-
增強方法
實現介面:
package proxyTest;
public interface computer {
public String method(double money);
String show();
}
實現真實物件:
package com.test.web.proxy; public class lenveo implements computer{ @Override public String method(double money) { System.out.println("花了+"+money+"買的電腦"); return "電腦"; } @Override public String show() { System.out.println("展示電腦"); return "展示電腦"; } }
實現動態代理:
//獲取傳入類載入器 //獲取傳入真實物件所有介面
proxy的引數:
- (lenveo.getClass().getClassLoader()類載入器
- lenveo.getClass().getInterfaces()真實物件接入的介面
- 匿名內部類,執行器invoke
public class test { public static void main(String[] args) { lenveo lenveo = new lenveo(); computer proxy = (computer) Proxy.newProxyInstance(lenveo.getClass().getClassLoader(), lenveo.getClass().getInterfaces(), new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("invoke方法執行了"); Object obj = method.invoke(lenveo, args); return obj; } }); String method = proxy.method(3000); proxy.show(); } }
invoke的引數
- proxy:代理物件
- method:代理物件執行的方法
- args:代理物件呼叫方法適合傳遞的實際引數
0x03結尾
使用動態代理,代理物件呼叫任意方法,代理的invoke方法都會執行。
動態代理機制還是很重要的,這上面這是很簡單的一部分。