原文连接:http://songbo-mail-126-com.iteye.com/blog/968792

------------------------------------------------------------------------

JDK实现动态代理需要实现类通过接口定义业务方法,对于没有接口的类,如何实现动态代理呢,这就需要CGLib了。CGLib采用了非常底层的字节码技术,其原理是通过字节码技术为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑。JDK动态代理与CGLib动态代理均是实现Spring AOP的基础。

简单的实现举例:

这是一个需要被代理的类,也就是父类,通过字节码技术创建这个类的子类,实现动态代理。

[java] view plain copy
  1. public class SayHello {
  2. public void say(){
  3. System.out.println("hello everyone");
  4. }
  5. }

该类实现了创建子类的方法与代理的方法。getProxy(SuperClass.class)方法通过入参即父类的字节码,通过扩展父类的class来创建代理对象。intercept()方法拦截所有目标类方法的调用,obj表示目标类的实例,method为目标类方法的反射对象,args为方法的动态入参,proxy为代理类实例。proxy.invokeSuper(obj, args)通过代理类调用父类中的方法。

[java] view plain copy
  1. public class CglibProxy implements MethodInterceptor{
  2. private Enhancer enhancer = new Enhancer();
  3. public Object getProxy(Class clazz){
  4. //设置需要创建子类的类
  5. enhancer.setSuperclass(clazz);
  6. enhancer.setCallback(this);
  7. //通过字节码技术动态创建子类实例
  8. return enhancer.create();
  9. }
  10. //实现MethodInterceptor接口方法
  11. public Object intercept(Object obj, Method method, Object[] args,
  12. MethodProxy proxy) throws Throwable {
  13. System.out.println("前置代理");
  14. //通过代理类调用父类中的方法
  15. Object result = proxy.invokeSuper(obj, args);
  16. System.out.println("后置代理");
  17. return result;
  18. }
  19. }

具体实现类:

[java] view plain copy
  1. public class DoCGLib {
  2. public static void main(String[] args) {
  3. CglibProxy proxy = new CglibProxy();
  4. //通过生成子类的方式创建代理类
  5. SayHello proxyImp = (SayHello)proxy.getProxy(SayHello.class);
  6. proxyImp.say();
  7. }
  8. }

输出结果:

[plain] view plain copy
  1. 前置代理
  2. hello everyone
  3. 后置代理

CGLib创建的动态代理对象性能比JDK创建的动态代理对象的性能高不少,但是CGLib在创建代理对象时所花费的时间却比JDK多得多,所以对于单例的对象,因为无需频繁创建对象,用CGLib合适,反之,使用JDK方式要更为合适一些。同时,由于CGLib由于是采用动态创建子类的方法,对于final方法,无法进行代理。

CGLib动态代理原理及实现相关推荐

  1. CGLib动态代理原理

    CGLib动态代理原理 CGLib动态代理是代理类去继承目标类,然后重写其中目标类的方法啊,这样也可以保证代理类拥有目标类的同名方法: 看一下CGLib的基本结构,下图所示,代理类去继承目标类,每次调 ...

  2. 【java】CGLIB动态代理原理分析

    1.概述 前一篇文章介绍了CGLIB中常用的API,实际上使用了Enhancer和MethodInterceptor之后会生成代理子类,这篇文章就是分析一下CGLIB动态代理的原理. 2.CGLIB动 ...

  3. JDK和CGLIB动态代理原理

    JDK动态代理原理解析 一.例子: 1.定义基础接口 public interface HttpApi {String get(String url); } 2.实现类 public class Re ...

  4. 深入理解Java Proxy和CGLIB动态代理原理

    点击上方关注,每天进步一点点 动态代理在Java中有着广泛的应用,比如Spring AOP,Hibernate数据查询.测试框架的后端mock.RPC,Java注解对象获取等.静态代理的代理关系在编译 ...

  5. Java Proxy和CGLIB动态代理原理

    动态代理在Java中有着广泛的应用,比如Spring AOP,Hibernate数据查询.测试框架的后端mock.RPC,Java注解对象获取等.静态代理的代理关系在编译时就确定了,而动态代理的代理关 ...

  6. 【java】CGLIB动态代理原理

    文章目录 1. 简介 2. 示例 3. 原理 4. JDK动态代理与CGLIB动态代理区别(面试常问) 1. 简介 CGLIB的全称是:Code Generation Library. CGLIB是一 ...

  7. 动态代理——CGLIB动态代理原理示例解析

    觉得可以的话点个关注,转个发呗,陆续奉上干货~~~~ 前文我们讲解了JDK动态代理的原理(动态代理--JDK动态代理原理),今天我们来看看CGLIB动态代理是如何实现,最后我们总结下JDK动态代理和C ...

  8. JDK和cglib动态代理原理详解

    AOP的基础是Java动态代理,了解和使用两种动态代理能让我们更好地理解 AOP,在讲解AOP之前,让我们先来看看Java动态代理的使用方式以及底层实现原理. 转自https://www.jiansh ...

  9. 【动态代理】CGLIB 动态代理的使用及原理

    1. CGLIB 动态代理介绍 什么是 CGLIB? CGLIB是一个功能强大,高性能的代码生成包.它为没有实现接口的类提供代理,为JDK的动态代理提供了很好的补充. 通常可以使用Java的动态代理创 ...

最新文章

  1. 008 centos7安装docker ce
  2. 检查oracle安装,oracle安装前环境检查
  3. 网站故障排查常用命令
  4. 如何实现分类表统计数目和详情表数量同步
  5. 重磅发布!阿里云云效《阿里巴巴DevOps实践指南》
  6. java1.5特性_JDK核心API:Java1.5语言新特性简单总结
  7. Builder Pattern 在 Objective-C 中的使用
  8. STL总结 (C++)
  9. linux 将远程mysql复制,在线备份MySQL及远程copy到远程备份服务器shell脚本
  10. mybatis_user_guide(6) Java API
  11. point-position2修改版
  12. Subversion服务器搭建 (安装步骤)
  13. 解决织梦(DedeCMS)系统自定义字段图片调用问题
  14. vrpie在Visio Studio 中无法调试的问题
  15. 数学知识点回顾(三)
  16. SylixOS 启动时mmu 初始化
  17. 项目管理实践_8Manage:保险行业的项目管理实践
  18. Android Canvas.DrawLine绘制线段
  19. 触摸板不小心卸载,触摸板重装,触摸板没有开关选项
  20. 修改Sublime Text 默认*.sublime-package文件

热门文章

  1. pandas mysql index_Pandas从入门到精通(3)- Pandas多级索引MultiIndex
  2. Python 装饰器详解(下)
  3. einops和einsum:直接操作张量的利器
  4. oracle错误1327,Oracle中的PGA监控报警分析(r11笔记第97天)
  5. atomikosdatasourcebean mysql_SpringBoot2整合JTA组件实现多数据源事务管理
  6. 多主机推送公钥、修改配置、修改密码脚本
  7. Angular Web App部署Ubuntu Nginx
  8. swing皮肤包 substance
  9. 用Emit技术替代反射
  10. ASP.NET Core Docker Jenkins 零基础持续集成实战