cglib动态代理实现
来源:互联网 发布:java中如何记录日志 编辑:程序博客网 时间:2024/06/05 05:21
cglib动态代理实现
cglib实现apo功能
实现
123456789101112131415161718192021
//目标类public class Subject {public int a=0;public Map<String,String> map=new HashMap<String,String>();public int say(String name){a++;System.out.println("say:"+name+"--"+a);return name.length();}public void putMap(String key,String value){map.put(key,value);}public String getMap(){return map.toString();}}
123456789101112131415161718
//代理类public class CglibProxyOne implements MethodInterceptor {@Overridepublic Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {// 排除Object类中的toString等方法//(和jdk代理一样都会把Object的toString,equals,hashCode方法进行代理)这边进行过滤boolean objFlag = method.getDeclaringClass().getName().equals("java.lang.Object");if(!objFlag){System.out.println("before");}//通过代理类调用父类中的方法Object result = methodProxy.invokeSuper(o, args);if(!objFlag){System.out.println("after");}return result;}}
123456789
//测试类public class Main {public static void main(String[] args) {CglibProxyMore proxy=new CglibProxyMore();Subject proxyImpl=(Subject)Enhancer.create(Subject.class,proxy);proxy.setTargetObj(proxyImpl);proxyImpl.say("cff");}}
1234
输出:beforesay:test--1after
cglib是可以直接以class进行代理,这边实现了单次的增强,重点是CglibProxyOne类中进行了方法增强.那么想要多次增强该怎么办呢?
cglib进行多次增强
1234567891011121314151617181920212223
public class CglibProxyMore implements MethodInterceptor {private Object targetObj;public void setTargetObj(Object targetObj) {this.targetObj = targetObj;}@Overridepublic Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {// 排除Object类中的toString等方法boolean objFlag = method.getDeclaringClass().getName().equals("java.lang.Object");if(!objFlag){System.out.println("before");}//通过代理类调用父类中的方法Object result = methodProxy.invokeSuper(targetObj, args);if(!objFlag){System.out.println("after");}return result;}}
思考: 代理类进行多次代理,进行测试
123456789101112131415161718
public class Main2 {public static void main(String[] args) {CglibProxyMore proxy=new CglibProxyMore();Enhancer e = new Enhancer();e.setSuperclass(Subject.class);e.setCallback(proxy);Subject proxyImpl= (Subject) e.create();proxy.setTargetObj(new Subject());//----------CglibProxyMore proxy2=new CglibProxyMore();Enhancer e2 = new Enhancer();e2.setSuperclass(Subject.class);e2.setCallback(proxy2);proxy2.setTargetObj(proxyImpl);Subject proxyImpl2= (Subject) e2.create();proxyImpl2.say("asdas");}}
1234
输出:beforesay:asdas--1after
还是只有一次,然后发现methodProxy代理对象执行的是invokerSuper方法,只会执行一次目标类的方法,所以只会进行一次增强.
那么改成invoke;
1
Object result = methodProxy.invoke(targetObj, args);
123456
输出:beforebeforesay:asdas--1afterafter
因为cglib动态代理针对类进行代理,对指定的类生成一个代理子类,那么想要多次增强,是否可以对代理子类再次进行代理,如果是这样,依旧用invokeSuper()方法,最终执行的都是目标类的方法,所以只会进行一次.
那么就要想办法可以循环执行,介于需要执行上一次代理子类的方法,那么我们将这个上级代理子类传递进来.每次多级代理的时候进行父级目标类的设入,达到多次增强的效果.
阅读全文
0 0
- CGLIB实现动态代理
- CGLIB实现动态代理
- cglib实现动态代理
- CGLib实现动态代理
- cglib 实现动态代理
- cglib动态代理实现
- Cglib实现动态代理原理
- Cglib实现动态代理原理
- cglib动态代理实现原理
- cglib 动态代理实现AOP
- Cglib 实现动态代理Proxy
- CGLIB 动态代理的实现
- 实战---CGLib实现动态代理
- 使用CGLib实现动态代理
- 动态代理之cglib实现
- Java动态代理--CGLib实现
- 动态代理和cglib实现
- Cglib动态代理模式实现
- UVa442
- JDBC
- ASM AMDU工具使用
- 半路出家, 我的iOS自学之路-2-头文件, 属性, 引用计数, 协议, 类别, 类扩展
- async异步问题(waterfall、parallel、eachSeries、map、whilst)
- cglib动态代理实现
- Contest_5 0614 By lhq
- gulp-删除文件和文件夹
- 基本数据类型
- LSMW批处理使用方法(08)_步骤8、9
- cocos2d-x 3.0rc0 lua练习最基础例子
- mysql数据库迁移出错后新建数据库表django
- 2PC到3PC到Paxos到Raft到ISR
- 在 <stdint.h> 中定义的 uint8_t 其实为 unsigned char