要理解AOP需要这么几个步骤:
反射——invoke()——代理——AOP。
在上一篇已经介绍了基础的反射是什么,和常见的API是如何使用的在此基础上,说明一下invoke()方法的使用。
invoke方法
invoke方法用于调用运行时类的指定结构。
- 通过Class类的getMethod(String name,Class…parameterTypes)方法取得一个Method对象,并设置此方法操作时所需要的参数类型。
- 使用Object invoke(Object obj,Object[] args)进行调用,并向方法中传递要设置的obj对象的参数信息。
Object invoke(Object obj,Object[] args)说明
- Object对应原方法的返回值,若原方法无返回值,此时返回null
- 若原方法为静态方法,此时形参Object obj可为null
- 若原方法形参列表为空,则Object[] args为null
- 若原方法声明为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工厂生产一批运动服
代理工厂做一些后续的收尾工作