代理模式之cglib动态代理
2015-08-22 11:06
369 查看
上一篇博客说了实现InvocationHandler接口的jdk动态代理,另一种实现动态代理的方式则是:通过继承的方式实现的cglib动态代理。
先在程序中导入cglib的包,cglib-nodep-2.1_3.jar。
还是和上一个例子一样,区别就在于代理的实现。
区别:
JDK的动态代理机制只能代理实现了接口的类,而不能实现接口的类就不能实现JDK的动态代理,cglib是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理。
测试的代码如下:
其实代理的核心还是在切面类中要有目标类的引用,这样的话就可以操作目标类.
测试类:
分析cglib源码:
首先是intercept方法,
通过其注释的描述,此方法的功能:
所有生成的代理方法调用此方法代替原有的方法。
原始的方法可以使用该方法对象的正常反射调用
public Object intercept(Object obj, java.lang.reflect.Method method, Object[] args,
MethodProxy proxy) throws Throwable;
各个参数:
* @param obj,增强的对象
* @param Method ,被拦截的方法
* @param args方法参数数组;
* @param用来调用超级(非拦截方法)的代理
先在程序中导入cglib的包,cglib-nodep-2.1_3.jar。
还是和上一个例子一样,区别就在于代理的实现。
区别:
JDK的动态代理机制只能代理实现了接口的类,而不能实现接口的类就不能实现JDK的动态代理,cglib是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理。
测试的代码如下:
package com.yc.advice; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; //这个类是一个切面类,完成的是向目标类的目标方法加入功能(增强) public class RightAdvice implements MethodInterceptor{ //代理模式最核心:代理模式中一定要有目标类的引用 private Object targetObject; //注意:这个就是目标类的引用 @Override public Object intercept(Object proxy, Method method, Object[] args, MethodProxy arg3) throws Throwable { String methodName=method.getName(); //调用目标类的对应的发放那个方法 Object returnvalue=method.invoke(targetObject, args); if(methodName.startsWith("add")||methodName.startsWith("del")||methodName.startsWith("update")){ //在invoke中加入您要增强的代码 check(); } return returnvalue; } //创建一个方法来完成创建代理对象 //代理模式最核心:代理模式中一定要有目标类的引用 public Object createInstance(Object targetObject){ this.targetObject=targetObject; Enhancer enhancer=new Enhancer(); //targetObject<- productBizProxy 子类 //TODO 这里要实现判断 enhancer.setSuperclass(targetObject.getClass()); enhancer.setCallback(this); return enhancer.create(); } public void check(){ System.out.println("$$$$$$$$$$$$$$$$$$$"); System.out.println("权限检查"); System.out.println("$$$$$$$$$$$$$$$$$$$"); } }
其实代理的核心还是在切面类中要有目标类的引用,这样的话就可以操作目标类.
测试类:
public class Test { public static void main(String[] args) { RightAdvice ra=new RightAdvice(); ProductBizImpl pb=new ProductBizImpl() ; ProductBizImpl productBizProxy=(ProductBizImpl) ra.createInstance(pb); productBizProxy.addProduct(); System.out.println("*****************************************88"); } }
分析cglib源码:
首先是intercept方法,
通过其注释的描述,此方法的功能:
所有生成的代理方法调用此方法代替原有的方法。
原始的方法可以使用该方法对象的正常反射调用
public Object intercept(Object obj, java.lang.reflect.Method method, Object[] args,
MethodProxy proxy) throws Throwable;
各个参数:
* @param obj,增强的对象
* @param Method ,被拦截的方法
* @param args方法参数数组;
* @param用来调用超级(非拦截方法)的代理
相关文章推荐
- SVM入门
- Go操作mysql实现增删改查及连接池
- cal命令
- 好记星不如烂笔头!就从今天开始吧~
- java 金额转大写
- 怎样打开64位 Ubuntu 的32位支持功能?
- hdu 5414 CRB and String
- 单例、工厂模式简介
- Minimum Size Subarray Sum
- Linux NAT网络连接权威指南
- Struts(17)注释
- Linux NAT网络连接权威指南
- 怎样打开64位 Ubuntu 的32位支持功能?
- 怎样打开64位 Ubuntu 的32位支持功能?
- 用vlc SDK创建一个播放视频文件和RTSP流视频的Demo
- C中->和.的区别
- Linux下Bash的变量使用,echo,read,declare,typeset,array,
- Linux_查看用户所属组
- Ubuntu下SVN客户端RapidSVN
- HttpClient发送post请求,和发送get请求