import java.lang.reflect.Method; import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; import net.sf.cglib.proxy.Callback; import net.sf.cglib.proxy.CallbackFilter; public class BusinessCglibProxyFilter { private static Callback callback1 = new MethodInterceptor() { @Override public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { System.out.println("before callback1 .."); Object result = proxy.invokeSuper(obj, args); System.out.println("after callback1 .."); return result; } }; private static Callback callback2 = new MethodInterceptor() { @Override public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { System.out.println("before callback2 .."); Object result = proxy.invokeSuper(obj, args); System.out.println("after callback2 .."); return result; } }; private static CallbackFilter callbackFilter = new CallbackFilter() { static final int EXECUTE_METHOD = 0; static final int OTHER_METHOD = 1; /* * accept需要返回一個int类型, * 该int类型为上文中setCallbacks设置的多个 * Callback处理逻辑的数组的下标 */ @Override public int accept(Method method) { /* * Method参数代表代理类的执行方法, * 以下logic为 判断执行方法名称是否为execute, * 是则执行callback1,也就是数组下标为0的逻辑, * 否则执行Other逻辑 */ if ("execute".equals(method.getName())) return EXECUTE_METHOD; else return OTHER_METHOD; } }; private BusinessCglibProxyFilter() { } //创建代理对象 public static Object getCglibProxy(Class<?> clazz) { //创建一个织入器 Enhancer enhancer = new Enhancer(); //设置父类 enhancer.setSuperclass(clazz); //设置需要织入的逻辑 enhancer.setCallbacks(new Callback[] { callback1, callback2 }); //设置回调方法过滤 enhancer.setCallbackFilter(callbackFilter); // 创建代理对象 //使用织入器创建子类 return enhancer.create(); } //由于CGLIB可以不需要实现接口来实现动态代理,其原理是通过字节码生成类的一个子类来完成的, //那就有可能出现需要动态代理对象不存在一个无参构造函数, //那么CGLIB在生成子类并实例化时将会产生错误。 //创建带参数的代理对象 public static Object getCglibProxy(Class<?> clazz, Class<?>[] args, Object[] argsValue) { //创建一个织入器 Enhancer enhancer = new Enhancer(); //设置父类 enhancer.setSuperclass(clazz); //设置需要织入的逻辑 enhancer.setCallbacks(new Callback[] { callback1, callback2 }); //设置回调方法过滤 enhancer.setCallbackFilter(callbackFilter); // 创建带参数的代理对象 //使用织入器创建子类 return enhancer.create(args, argsValue); } public static void main(String[] args) { BusinessImpl proxy = (BusinessImpl) BusinessCglibProxyFilter.getCglibProxy(BusinessImpl.class); proxy.service(); proxy.execute(); //带参数的业务类 BusinessImpl proxy1 = (BusinessImpl) BusinessCglibProxyFilter.getCglibProxy(BusinessImpl.class, new Class[] {String.class}, new Object[] {"jaesonchen"}); proxy1.service(); proxy1.execute(); } }
* 在真实开发当中,在使用动态代理进行方法请求拦截时,可能会需要判断调用的方法然后决定拦截的逻辑,
也就是同一个代理类在调用不同的方法时拦截的逻辑都不相同,CGLIB提供了CallbackFilter来帮助我们
实现这一功能。
输出为:
before callback2 ..
service.id = default
after callback2 ..
before callback1 ..
execute.id = default
after callback1 ..
before callback2 ..
service.id = jaesonchen
after callback2 ..
before callback1 ..
execute.id = jaesonchen
after callback1 ..
相关推荐
java静态代理 jdk动态代理 cglib动态代理 代理原理
AOP之JDK动态代理和CGLib动态代理 ,具体效果和过程看博文 http://blog.csdn.net/evankaka/article/details/45195383
基于MAVEN项目的CGLib动态代理原理及实现
该资源里面有Jdk动态代理,cglib动态代理,反射和拦截器(链)示例,里面也有所需要的jar包,下载下来导入eclipse即可运行,有问题请问我
Java 动态代理详解(代理模式+静态代理+JDK动态代理+CGLIB动态代理) Java 动态代理是 Java 编程语言中的一种强大工具,广泛应用于 Spring AOP、Hibernate 数据查询、测试框架的后端 mock、RPC 远程调用、Java 注解...
CGlib动态代理类jar包,一共四个jar包,模拟CGlib动态代理用得到。
JDK动态代理必须提供接口才能使用,在一些不能提供接口的环境中,只能采用其他第三方技术,比如CGLIB动态代理,这里提供CGLIB动态代理的相关jar包,供学习和测试使用。
代理模式详解-jdk与cglib动态代理与底层实现,spring中常用的设计模式,本案例是从源码到代理模式的实现。
jdk和cglib动态代理的例子{jar包+源码} 解压:如有问题 用快压
cglib动态代理相关jar包,亲测可用cglib动态代理相关jar包,亲测可用cglib动态代理相关jar包,亲测可用
cglib动态代理用到的两个包 cglib动态代理用到的两个包 cglib动态代理用到的两个包
CGLIB是一个基于ASM的字节码生成库,它允许我们在运行时对字节码进行修改和动态生成。cglib通过继承方式实现代理,也就是基于类,在子类中采用方法拦截的技术拦截所有父类方法的调用并顺势织入横切逻辑。 我们最终是...
Cglib 动态代理的实现方式是:我们首先需要定义一个类,然后使用 Cglib 库来生成该类的代理对象,该代理对象将拦截对被代理对象的所有方法调用,并控制对被代理对象的访问。 Cglib 动态代理的优点是:它的实现方式...
JAVA动态代理实现Demo(JDK动态代理和CGLIB动态代理)
NULL 博文链接:https://agileshell.iteye.com/blog/1857897
cglib-nodep-2.1_3.jar、asm-2.2.3.jar、asm-commons-2.2.3.jar、asm-util-2.2.3.jar四个包
NULL 博文链接:https://jummy.iteye.com/blog/255628
cglib实现动态代理,有源代码,详细的实例,逐步分析,实现动态代理。
动态代理和cglib例子,动态代理和cglib例子动态代理和cglib例子动态代理和cglib例子
Spring框架的AOP中重要的一个知识点,动态代理,springAOP框架会根绝实际情况选择使用jdk的动态代理还是cglib的动态代理