Aop动态代理和cglib实现代码详解
- 更新时间:2023-01-04 12:03:01
- 编辑:连力行
参考资料
- Selenium3自动化测试:基于java学习手册 / 5.65 MB / 码小辫 推荐度:
- Java并发编程的艺术 PDF 电子书 / 148 MB / 方腾飞,魏鹏,程晓明 推荐度:
- OSGi与Equinox:创建高度模块化的Java系统 PDF 电子书 / 21.8 MB / Jeff McAffer 推荐度:
正文内容
Aop动态代理
一般我们使用Aop对象时,常用动态代理模式,即是采用映射一个相同的类在此基础上进行前置后置操作。
动态代理多是采用原类实现父类接口,然后动态代理一个和原类相同的双胞胎兄弟类来实现映射。
父类
public interface InterF { public void save(); }
需要映射的类
public class Origin implements InterF{ @Override public void save() { System.out.println("测试一下"); } }
动态代理映射,此类需要传入相应的原类对象
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; /** * @author bai * @create 2019-10-25-16:47 */ public class ProxyJdk implements InvocationHandler { private Object target; public Object getProxy(Object target){ this.target=target; return Proxy.newProxyInstance(this.getClass().getClassLoader(),target.getClass().getInterfaces(),this); } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("我来了"); Object invoke = method.invoke(target, args); System.out.println("我走了"); return invoke; } }
测试类
public class Mytest { public static void main(String[] args) { Origin o=new Origin(); ProxyJdk pj=new ProxyJdk(); InterF proxy = (InterF) pj.getProxy(o); proxy.save(); } }
复制代码
cglib模式的代理和动态代理大同小异,模式上相同,但cglib采用的是直接实现父子类,继承原类来实现映射。
原类
public class Origin{ public void save() { System.out.println("测试一下"); } }
cglib映射类,此类也需要传入原类
import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; import java.lang.reflect.Method; /** * @author bai * @create 2019-10-25-17:26 */ public class CglibProxy implements MethodInterceptor{ private Object target;//被代理目标 public Object getProxy(Object target){ this.target=target; Enhancer enhancer = new Enhancer(); //1.设置基类 enhancer.setSuperclass(target.getClass()); //2.设置回调接口 enhancer.setCallback(this);//MethodInterceptor实现类 //3.创建动态代理 return enhancer.create(); } @Override public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { System.out.println("准备前"); Object invoke = method.invoke(target, objects); System.out.println("准备后"); return invoke; } }
o是传入的对象,method是相应的切点所切方法,objects即参数。
测试类
public class Mytest2 { public static void main(String[] args) { Origin o=new Origin(); CglibProxy cp=new CglibProxy(); Origin proxy = (Origin) cp.getProxy(o); proxy.save(); } }
cglib相对于动态代理少了一个父类,更加便捷。且cglib使用时需要导入相应的jar包
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持码农之家。
java相关教程
-
Java并发编程之对象的共享
给大家整理一篇关于Java 并发的教程,这篇文章主要介绍了Java并发编程之对象的共享,介绍如何共享和发布对象,使它们被安全地由多个进程访问。需要的小伙伴可以参考一下
发布时间:2022-09-14
-
Java中byte输出write到文件的方法实例
今天小编就为大家分享一篇关于Java中byte输出write到文件的实现方法讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
发布时间:2019-06-24
-
为什么 Java 8 中不需要 StringBuilder 拼接字符串
给网友们整理关于Java的教程,java8中,编辑器对“+”进行了优化,默认使用StringBuilder进行拼接,所以不用显示的使用StringBuilder了,直接用“+”就可以了。下面我们来详细了解一下
发布时间:2022-10-19
-
详解Java中运算符及用法
为网友们分享了关于Java运算符的教程,这篇文章主要介绍了详解Java中运算符以及相关的用法讲解,一起跟着小编学习下吧。
发布时间:2022-06-22
-
java实现堆的实例及代码(建堆,插入,删除)
下面小编就为大家分享一篇java实现堆的操作方法(建堆,插入,删除),具有很好的参考价值,希望对大家有所帮助
发布时间:2021-06-02
-
Java中常见异常打印输出方式
Java异常是在Java应用中的警报器,下面这篇文章主要给大家介绍了关于Java中异常打印输出的常见方法的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看
发布时间:2020-01-09
-
Java StringBuffer类与StringBuilder类的实例用法
这篇文章主要介绍了Java StringBuffer类与StringBuilder类用法,结合实例形式总结分析了Java StringBuffer类与StringBuilder类的功能、原理及添加、删除、替换、截取等操作实现技巧,需要的朋友可以参考下
发布时间:2019-07-03
-
java设计模式中代理模式的知识点
下面小编就为大家带来一篇java设计模式-代理模式(实例讲解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
发布时间:2020-06-18
-
java装饰者模式23种设计模式总结
这篇文章主要为大家详细介绍了23种设计模式之java装饰者模式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
发布时间:2020-01-23