cglib 项目地址:https://github.com/cglib/cglib 。
和 Java自带的动态代理 ( 动态代理 )不同,cgilib 动态代理没有必须使用接口的限制。也就是,如果一个类没有实现任何接口,cglib 支持对其生成动态代理。当然,如果一个类实现了一些接口,cglib 也支持对其生成动态代理。cglib 的代理机制基于继承。
要使用 cglib,需要引入依赖。如果使用 gradle 构建项目,配置依赖如下:
入门
Hello 类是要被代理的类:
方法执行的拦截器类,用于实现动态代理:
测试代理效果:
运行结果:
MethodInterceptor 是方法级别的代理
上面的示例中,CustomInterceptor 继承自 MethodInterceptor 。MethodInterceptor 实现的是方法级别的代理。当被代理类进行自调用时,依然会执行代理逻辑。
在 Hello 类的 hello 方法中增加自调用:
运行下面的测试代码:
结果如下:
使用 InvocationHandler 构造类级别的代理
有时候,我们并不想自调用的时候走代理逻辑,那么,可以使用 InvocationHandler 构造类级别的代理。
Java本身的动态代理中也涉及一个类,名字也是 InvocationHandler 。不过它的全路径是 java.lang.reflect.InvocationHandler。 cglib 中的全路径是 net.sf.cglib.proxy.InvocationHandler。
我们看下如何使用:
假如被代理类代码是:
测试代理效果:
运行结果如下:
可以看到,输出 hi 时,没有输出 CustomInterceptor 中那些额外内容。