一、动态代理概述:
1、AspectJ是采用编译时生成AOP代理类,具有更好的性能,但是需要使用特定的编译器进行处理
Object proxy:指被代理的对象
Method method:我们所要调用被代理对象的某个方法的Method对象
Object[] args:被代理对象某个方法调用时所需要的参数
可以将InvocationHandler接口的子类想象成一个代理的最终操作类。
与静态代理对照(关于静态代理的介绍 可以阅读上一篇:JAVA设计模式之 代理模式【Proxy Pattern】),
动态代理类的字节码是在程序运行时由Java反射机制动态生成。
注意:1、AspectJ是采用编译时生成AOP代理类,具有更好的性能,但是需要使用特定的编译器进行处理
2、Spring AOP采用运行时生成AOP代理类,无需使用特定编译器进行处理,但是性能相对于AspectJ较差
二、JDK动态代理 [对有实现接口的对象做代理]
1、JDK动态代理中 需要了解的两个重要的类或接口 [InvocationHandler 和 Proxy]
① InvocationHandler接口
public interface InvocationHandler {
public Object invoke(Object proxy,Method method,Object[] args) throws Throwable;
}
参数说明: Object proxy:指被代理的对象
Method method:我们所要调用被代理对象的某个方法的Method对象
Object[] args:被代理对象某个方法调用时所需要的参数
可以将InvocationHandler接口的子类想象成一个代理的最终操作类。
说明:每一个动态代理类都必须要实现InvocationHandler这个接口,并且每个代理类(Proxy)的实例都关联到了一个handler,当我们通过代理对象调用一个方法的时候,这个方法的调用就会被转发为由InvocationHandler这个接口的 invoke 方法来进行调用。同时在invoke的方法里 我们可以对被代理对象的方法调用做增强处理(如添加事务、日志、权限验证等操作)。
② Proxy类
Proxy类是专门完成代理的操作类,可以通过此类为一个或多个接口动态地生成实现类,该类常用的调用方法如下: