此处以JDK动态代理为例
JAVA动态代理有两大核心类,它们都在Java的反射包下(java.lang.reflect):
InvocationHandler
每一个代理实例都要有一个关联的InvocationHandler
方法:
Object invoke(Object proxy, Method method, Object[] args)
作用:用于方法调用的约束与增强
Proxy
作用:创建动态代理类及其实例
方法:
1.构造函数(设置代理实例的调用处理器)
Proxy(InvocationHandler h)
接受一个参数:接口InvocationHandler的实现
作用:用于设置代理实例的调用处理器
2.返回代理Class对象
Class<?> getProxyClass(ClassLoader loader, Class<?>… interfaces)
3.一个Object类型的代理类
Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)
静态内部类(生成静态代理类的Class对象):
ProxyClassFactory
主要操作:
用ProxyGenerator来生成字节码:ProxyGenerator.generateProxyClass(proxyName,interfaces, accessFlags)
根据二进制文件生成相应的Class实例:defineClass0(loader, proxyName, proxyClassFile, 0, proxyClassFile.length)
使用:
1.定义目标类实现的接囗,定义目标类实现的接囗
2.自定义InvocationHandler,在invoke()方法中写自己对方法所做的增强
3.用自定义InvocationHandler的构建Proxy类,然后调用类方法newProxyInstance()生成代理类
Spring AOP在JAVA动态代理上所做的改造:
1.将Proxy与自定义InvocationHandler合二为一,即类JdkDynamicAopProxy
2.Proxy调用newProxyInstance()方法生成代理类,JdkDynamicAopProxy调用getProxy()方法生成代理类(内部调用Proxy.newProxyInstance()方法)