cglib动态代理
来源:互联网 发布:佩斯大学 知乎 编辑:程序博客网 时间:2024/05/11 19:37
JDK的动态代理是基于接口的,委托类必须实现接口。但是如果委托类没实现任何接口呢?这时就需要使用cglib的动态代理了。看例子
package cn.proxy;public class User {public void add(){System.out.println("add user......");}public void delete(){System.out.println("delete user........");}}
package cn.proxy;import java.lang.reflect.Method;import net.sf.cglib.proxy.Enhancer;import net.sf.cglib.proxy.MethodInterceptor;import net.sf.cglib.proxy.MethodProxy;public class CglibProxy implements MethodInterceptor{public Object getProxy(Object target){Enhancer enhancer=new Enhancer();enhancer.setSuperclass(target.getClass());enhancer.setCallback(this);//这个方法可以放到测试类那些,只要new 一个CglibProxy代替这个this就OK了return enhancer.create();}@Overridepublic Object intercept(Object obj, Method method, Object[] param,MethodProxy methodProxy) throws Throwable {System.out.println(methodProxy.getSuperName()+" "+method.toString()+" 执行前......");Object result=methodProxy.invokeSuper(obj, param);System.out.println(methodProxy.getSuperName()+" "+method.toString()+" 执行后......");return result;}}
package cn.proxy;import net.sf.cglib.core.DebuggingClassWriter;public class CglibClientTest {public static void main(String[] args) {//将cglib生成的东西给打印出来System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "E:/tmp/1"); User userProxy=(User)(new CglibProxy().getProxy(new User()));userProxy.add();userProxy.delete();}}
运行结果
CGLIB debugging enabled, writing to 'E:/tmp/1'
CGLIB$add$0 public void cn.proxy.User.add() 执行前......
add user......
CGLIB$add$0 public void cn.proxy.User.add() 执行后......
CGLIB$delete$1 public void cn.proxy.User.delete() 执行前......
delete user........
CGLIB$delete$1 public void cn.proxy.User.delete() 执行后......
用反编译工具看了下E:/tmp/1下的内容,发现生成的东西挺多的,不像JDK动态代理那样就生成一个代理类,很容易就看明白了运行过程。下面就贴下生成的目录吧,至于源码就不贴了(水平有限,没能完全搞懂。。。。)
- 动态代理-CGLib动态代理
- 初识CGLIB动态代理
- Cglib 动态代理
- CGLib 动态代理
- 动态代理-->cglib
- cglib动态代理介绍
- cglib动态代理
- CGLIB 动态代理。
- CGLIB动态代理
- CGLIB实现动态代理
- cglib 动态代理
- cglib动态代理模式
- cglib动态代理
- cglib动态代理
- CGLIB 动态代理
- cglib动态代理
- 动态代理CGLIB
- CGLIB动态代理应用
- 就这一个链接让你搞懂drupal7的hook
- SQlite数据库的C编程接口(二) 数据库连接
- 小谈libcurl
- C语言简单示例(文件读写7)
- SQlite数据库的C编程接口(三) 预处理语句(Prepared Statements)
- cglib动态代理
- 转发和重定向区别
- SQlite数据库的C编程接口(四) 绑定参数(Bound Parameters)
- 单行显示的UILabel根据文字内容自动调整宽度,文字下方加下划线
- SQlite数据库的C编程接口(五) 便捷函数(Convenience Functions)
- js接收url参数值
- MFC中定时器的使用
- MFC文件压缩
- [C/C++]福尔摩斯 ABCDE*?=EDCBA