动态代理(CGLIB实现)
CGLIB(Code Generation Library)是一个开源项目。可以直接对类进行增强,而不需要像JDK的动态代理,需要增强的类必须实现某接口
在使用Spring框架时,因为Spring框架中core包中引入了cglib所以如果想通过cglib来实现动态代理,不需要专门的导cglib的jar包。
创建代理工厂时,必须得实现MethodInterceptor接口,因为通过cglib创建的代理对象在调方法时会默认执行intercept方法,通过该方法增加目标对象方法。
public class CglibProxyFactory implements MethodInterceptor {
//通过构造方法,把目标对象传进来
private Object target;
public CglibProxyFactory(Object target) {
this.target = target;
}
//得到代理对象
public Object getProxyObject() {
Enhancer enhancer = new Enhancer(); //实例化cglib代理增强器-
enhancer.setSuperclass(target.getClass()); //设置目标的类:通过目标类对象来生成代理子对象
enhancer.setCallback(this); //回调方法 参数:回调的对象
return enhancer.create(); // 通过增强器得到代理对象
}
//增强目标对象方法
@Override
public Object intercept(
Object proxy, //代理对象
Method method, //目标对象的方法
Object[] args, //需要增强的方法的参数
MethodProxy proxyMethod //代理对象的方法继承目标对象的方法(method)
) throws Throwable {
System.out.println("前置增强");
//直接调用目标对象的方法(目标方法执行方式1)
Object value = method.invoke(target, args);
//调用代理代理对象的父类方法,相当于间接调用目标对象的方法(目标方法执行方式2)
Object value = proxyMethod.invokeSuper(proxy, args);
System.out.println("后置增强");
return value;
}
}
最新文章
- iDB是如何运转的 一
- Groovy学习笔记(二)
- win server2008R2安装framework1.1后,在应用池中不能编辑选择framework1.1的解决办法
- poj: 1207
- Cocos2d-x利用CCHttpRequest获取网络图片并显示
- HDU 4325-Flowers(线段树+离散化)
- K - Candies(最短路+差分约束)
- CF#345 div2 A\B\C题
- Int16 Int32 Int64
- JQuery和原生JS跨域加载JSON数据或HTML。
- 微信原始demo
- PCA算法数学原理及实现
- 【PHP篇】输出方法
- js中const,var,let区别(转载)
- Mysql的用户管理
- 《微信小程序组件》收集
- python之参数解包
- go语言学习--protobuf的学习
- DOM操作之属性和样式操作
- 【校招面试 之 剑指offer】第10-1题 斐波那契数列
热门文章
- 解决Notepad++ Plugin Manager无法加载插件的方法
- SOAP 版本可能不匹配: 出现意外的 Envelope 命名空间 http://schemas.xmlsoap.org/wsdl/
- MongoDB中使用的SCRAM-SHA1认证机制
- 微软AntiXSS防止xss攻击类库
- Golang之实现一个负载均衡算法(随机,轮询)
- Linux gperf命令
- chrome扩展安装图文教程
- [模板]tarjan缩点+拓扑排序
- CTF中的变量覆盖漏洞
- Android的/system/lib里加入自己的so库