一、本文内容分类

1、接口功能。

2、接口运用场景。

3、使用案例。

4、注意事项。

二、接口功能介绍

1、Enhancer是一个类的增强器,可以完成对类的代理,在Spring中经常可以看到他的身影比如@Configuration注解的类就会被Enhancer代理。代理时底层用了个字节码处理ASM,ASM是个很牛的东西关于ASM请看我博客里的另一篇文章。Enhancer的源码比较多,我这里就简单地贴一些。

因为Enhancer目的就是为了完成代理,所有我们称之为代理类,被代理的类我们称目标类。private Class[] interfaces;//存的是代理类实现的所有接口。
private CallbackFilter filter;
private Callback[] callbacks; //回调函数,这个很厉害。
private Class superclass;//该代理的父类,也就是目标类

2、上面属性中有个callbacks字段,类型是Callback,回想下我们在开发中用过Callback的哪些子类,大名鼎鼎的MethodInterceptor不知道大家还有没有印象,这个类可以拦截我们的目标方法。想象下这个类多么恐怖,不仅能代理你的类,还能拦截你的方法,Spring Aop就是这样实现的。下面Enhancer类结合MethodInterceptor写个简单的Demo。

三、接口运用场景

四、使用案例。

1、有个目标类A,通过Enhancer来完成代理,往Enhancer里面添加拦截器,拦截A的方法,拦截后再调用目标类的方法。

2、目标类IndexDao

public class IndexDao {//添加一个查询方法。public void query(){System.out.println("indexDao-query");return ;}}

2、拦截器类MyMethodInterceptor

import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;import java.lang.reflect.Method;public class MyMethodInterceptor implements MethodInterceptor {@Overridepublic Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {//o表示目标类,method目标类的方法,objects目标类方法需要的形参,methodProxy表示代理类+目标方法。System.out.println("拦截("+method.getName()+")方法");//执行目标类的方法。return methodProxy.invokeSuper(o,objects);}
}

3、Enhancer类

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class AppTest {public static void main(String[] args) {// 先创建一个代理对象Enhancer enhancer = new Enhancer();// 要代理的对象的classenhancer.setSuperclass(IndexDao.class);// 设置代理的回调,Callback的实现类enhancer.setCallback(new MyMethodInterceptor());//创建代理对象IndexDao indexDao = (IndexDao) enhancer.create();indexDao.query();}
}

4、打印结果

拦截(query)方法
indexDao-query

5、结果分析

在执行query()时,先执行了intercept方法,就好比在执更新操作前申明事务,在执行methodProxy.invokeSuper(o,objects)方法如果报错,我们就可以在这行代码后面添加回滚代码。

五、注意事项

1、MethodInterceptor拦截的是该类下手动添加的方法,像一些toString,hasCode这种,如果没有重写是不会拦截的。

2、enhancer.create()里面的知识点还是挺多的,感兴趣的可以深入理解下。

有问题的地方也麻烦大家在下面留言,我在进一步完善下哈。

cglib中Enhancer介绍相关推荐

  1. CGLib中类Enhancer介绍

    Enhancer常用的方法介绍 Enhancer enhancer = new Enhancer(); 1.设置要继承的父类 enhancer.setSuperclass(superclass); 2 ...

  2. cglib中Enhancer的简单使用

    cglib 是一个强大的, 高效高质的代码生成库. 简单的使用方法 Enhancer中有几个常用的方法, setSuperClass和setCallback, 设置好了SuperClass后, 可以使 ...

  3. CGlib、Enhancer、ProxyFactory在springboot中的实现动态代理

    本人博客原地址:CGlib.Enhancer.ProxyFactory在springboot中的实现动态代理 创作时间:2019.06.27 11:38:35 基于springboot2.1.4 在s ...

  4. cglib之Enhancer

    1. 背景 cglib库的Enhancer在Spring AOP中作为一种生成代理的方式被广泛使用.本文针对Enhancer的用法以实际代码为例作一些介绍. 2. Enhancer是啥 Enhance ...

  5. CGLIB中BeanCopier源码实现

    转载:CGLIB中BeanCopier源码实现 文章目录 CGLIB代码包结构 1.core 2.beans 3.reflect 4.proxy BeanCopier实现机制 1.BeanCopier ...

  6. Cglib之Enhancer创建动态代理

    CGLIB是一个强大.高性能的字节码生成库,它用于在运行时扩展Java类和实现接口:本质上它是通过动态的生成一个子类去覆盖所要代理的类(非final修饰的类和方法).Enhancer是一个非常重要的类 ...

  7. scala array 删除元素_Array中some介绍

    概念 Array.prototype.some方法测试数组中是不是至少有1个元素通过了被提供的函数测试.它返回的是一个Boolean类型的值. 语法 arr.some(callback(element ...

  8. jdk中的动态代理和cglib中动态代理的区别

    jdk中动态代理: 要求目标对象必须实现了某个接口. 代理对象和目标对象要想实现相同的功能,在底层的表现是代理对象和目标对象实现了相同的接口,因此获取代理对象后(Object类型),应该向下转型为目标 ...

  9. java中的jre里面有什么_Java中JRE介绍,JRE是什么

    首页 > 基础教程 > 基础知识 > JDK&JRE&JVM Java中JRE介绍,JRE是什么 JRE简介 JRE(Java Runtime Environment ...

最新文章

  1. Q币才是腾讯真正的世界级产品
  2. 深度学习的基础知识(机器学习、损失函数、梯度下降、反向传播、基础模型一网打尽)
  3. Spring Session - 使用Spring Session从零到一构建分布式session
  4. 组态王怎么做超级曲线_鸭肉怎么做?大叔教你红烧鸭块,香气扑鼻,简单易做,超级好吃...
  5. puppet puppet模块、file模块
  6. 线上分享|云和恩墨大讲堂201902:MySQL基础之体系结构
  7. 2020年已裸辞5个月(软文)
  8. 视频教程-VB程序设计入门基础-其他
  9. python渗透测试神器_专题:网络安全工具百宝箱之渗透测试神器_51CTO.COM
  10. html英文参考文献,英文参考文献标准格式
  11. .bat文件创建和编辑方法
  12. 数学中蕴含的人生哲理
  13. 【2021/12/21】MySQL的json查询之json_keys、json_object、json_overlaps、json_pretty
  14. 为什么中国程序员工资那么高,连一个 MATLAB 的替代品都开发不出来?
  15. 路由器不同网段虚拟服务器设置,局域网中不同网段互访?静态路由表必须要学会设置...
  16. 数据库学习之初见oracle
  17. [编程语言的对比式学习] C++ vs C#
  18. py2exe安装使用
  19. 新闻图片处理软件:Microsoft Office Picture Manager
  20. 用计算机学数学日记,【实用】数学日记范文7篇

热门文章

  1. protect 继承_c++三种继承方式public,protect,private
  2. 叉积 微分 恒等式_最美的公式:你也能懂的麦克斯韦方程组(微分篇)(下)...
  3. 车辆姿态角(Euler角)Pitch、Yaw、Roll 的设定
  4. 【C++】初学1———代码分析
  5. 如何区分嵌入式系统和嵌入式操作系统
  6. 率土之滨服务器进备战区维护多久,率土之滨备战区维护,备战区为什么不拆战法...
  7. 编译原理 —— 字母表
  8. JavaScript 实现 HTMLDecode
  9. 更正:复旦大学工研院计算机学硕不是第一年招生
  10. 四年级计算机走进传统节日教案,小学信息技术黔科版四年级上册第一单元 中国传统节日——制作简单电子作品活动3 使用资料制作作品教案...