1. 程式人生 > 其它 >java學習之動態代理

java學習之動態代理

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的引數:

  1. (lenveo.getClass().getClassLoader()類載入器
  2. lenveo.getClass().getInterfaces()真實物件接入的介面
  3. 匿名內部類,執行器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的引數

  1. proxy:代理物件
  2. method:代理物件執行的方法
  3. args:代理物件呼叫方法適合傳遞的實際引數

0x03結尾

使用動態代理,代理物件呼叫任意方法,代理的invoke方法都會執行。

動態代理機制還是很重要的,這上面這是很簡單的一部分。