导读:
1、JDK动态代理原理是什么?为什么不支持类的代理?
2、JDK动态代理实例
3、CGLib代理原理是什么?
4、CGLib代理实例
5、JDK动态代理与CGLib代理的区别是什么?
6、总结
利用拦截器(拦截器必须实现InvocationHanlder)加上反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。是在程序运行的过程中,根据被代理的接口来动态生成代理类的class文件,并加载运行的过程。
之所以只支持实现了接口的类的代理。从原理上讲是因为JVM动态生成的代理类有如下特性:
继承了Proxy类,实现了代理的接口,最终形式如下(HelloInterface为被代理类实现的接口):
public final class $Proxy0 extends Proxy implements HelloInterface{ ....... }然而由于java不能多继承,这里已经继承了Proxy类了,不能再继承其他的类,所以JDK的动态代理不支持对实现类的代理,只支持接口的代理。
从使用上讲,创建代理类时必须传入被代理类实现的接口。
1.1 详细介绍:
在java的动态代理机制中,有两个重要的类或接口,一个是InvocationHandler(Interface)、另一个则是 Proxy(Class),这一个类和接口是实现我们动态代理所必须用到的。
1.1.1 InvocationHandler
每一个动态代理类都必须要实现InvocationHandler这个接口,并且每个代理类的实例都关联了一个handler,当我们通过代理对象调用一个方法的时候,这个方法的调用就会被转发为由InvocationHandler这个接口的 invoke 方法来进行调用。
InvocationHandler这个接口的唯一一个方法 invoke 方法:
Object invoke(Object proxy, Method method, Object[] args) throws Throwable这个方法一共接受三个参数,那么这三个参数分别代表如下:
- proxy: 指代JDK动态生成的最终代理对象
- method: 指代的是我们所要调用真实对象的某个方法的Method对象
- args: 指代的是调用真实对象某个方法时接受的参数
1.1.2 Proxy
Proxy这个类的作用就是用来动态创建一个代理对象的类,它提供了许多的方法,但是我们用的最多的就是 newProxyInstance 这个方法:
public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler handler)

