欢迎关注公众号:程序员面试经验分享(jobbible)
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的动态代理不支持对实现类的代理,只支持接口的代理。
从使用上讲,创建代理类时必须传入被代理类实现的接口。
详细介绍:
在java的动态代理机制中,有两个重要的类或接口,一个是 InvocationHandler(Interface)、另一个则是 Proxy(Class),这一个类和接口是实现我们动态代理所必须用到的。
1、InvocationHandler
每一个动态代理类都必须要实现InvocationHandler这个接口,并且每个代理类的实例都关联了一个handler,当我们通过代理对象调用一个方法的时候,这个方法的调用就会被转发为由InvocationHandler这个接口的 invoke 方法来进行调用。
InvocationHandler这个接口的唯一一个方法 invoke 方法:
Object invoke(Object proxy, Method method, Object[] args) throws Throwable
这个方法一共接受三个参数,那么这