动态代理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工厂生产一批运动服
代理工厂做一些后续的收尾工作

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