動態代理AOP的實現-反射的應用

要理解AOP需要這麼幾個步驟:
反射——invoke()——代理——AOP。
在上一篇已經介紹了基礎的反射是什麼,和常見的API是如何使用的在此基礎上,說明一下invoke()方法的使用。

invoke方法

invoke方法用於調用運行時類的指定結構。

  1. 通過Class類的getMethod(String name,Class…parameterTypes)方法取得一個Method對象,並設置此方法操作時所需要的參數類型。
  2. 使用Object invoke(Object obj,Object[] args)進行調用,並向方法中傳遞要設置的obj對象的參數信息。

在這裏插入圖片描述

Object invoke(Object obj,Object[] args)說明
  1. Object對應原方法的返回值,若原方法無返回值,此時返回null
  2. 若原方法爲靜態方法,此時形參Object obj可爲null
  3. 若原方法形參列表爲空,則Object[] args爲null
  4. 若原方法聲明爲private,則需要在此調用此invoke()方法前,顯示調用方法對象的setAccessible(true)方法,將可訪問private的方法。

代理

代理分爲靜態代理和動態代理。

靜態代理

首先實現一個靜態代理。

/**
 * 靜態代理舉例
 *
 * 特點:代理類和被代理類在編譯期間,就確定下來了。
 */
interface ClothFactory{

    void produceCloth();

}

//代理類
class ProxyClothFactory implements ClothFactory{

    private ClothFactory factory;//用被代理類對象進行實例化

    public ProxyClothFactory(ClothFactory factory){
        this.factory = factory;
    }

    @Override
    public void produceCloth() {
        System.out.println("代理工廠做一些準備工作");

        factory.produceCloth();

        System.out.println("代理工廠做一些後續的收尾工作");

    }
}

//被代理類
class NikeClothFactory implements ClothFactory{

    @Override
    public void produceCloth() {
        System.out.println("Nike工廠生產一批運動服");
    }
}

public class StaticProxyTest {
    public static void main(String[] args) {
        //創建被代理類的對象
        ClothFactory nike = new NikeClothFactory();
        //創建代理類的對象
        ClothFactory proxyClothFactory = new ProxyClothFactory(nike);

        proxyClothFactory.produceCloth();

    }
}
代理工廠做一些準備工作
Nike工廠生產一批運動服
代理工廠做一些後續的收尾工作

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章