CGLib动态代理原理及实现
原文连接:http://songbo-mail-126-com.iteye.com/blog/968792
------------------------------------------------------------------------
JDK实现动态代理需要实现类通过接口定义业务方法,对于没有接口的类,如何实现动态代理呢,这就需要CGLib了。CGLib采用了非常底层的字节码技术,其原理是通过字节码技术为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑。JDK动态代理与CGLib动态代理均是实现Spring AOP的基础。
简单的实现举例:
这是一个需要被代理的类,也就是父类,通过字节码技术创建这个类的子类,实现动态代理。
- public class SayHello {
- public void say(){
- System.out.println("hello everyone");
- }
- }
该类实现了创建子类的方法与代理的方法。getProxy(SuperClass.class)方法通过入参即父类的字节码,通过扩展父类的class来创建代理对象。intercept()方法拦截所有目标类方法的调用,obj表示目标类的实例,method为目标类方法的反射对象,args为方法的动态入参,proxy为代理类实例。proxy.invokeSuper(obj, args)通过代理类调用父类中的方法。
- public class CglibProxy implements MethodInterceptor{
- private Enhancer enhancer = new Enhancer();
- public Object getProxy(Class clazz){
- //设置需要创建子类的类
- enhancer.setSuperclass(clazz);
- enhancer.setCallback(this);
- //通过字节码技术动态创建子类实例
- return enhancer.create();
- }
- //实现MethodInterceptor接口方法
- public Object intercept(Object obj, Method method, Object[] args,
- MethodProxy proxy) throws Throwable {
- System.out.println("前置代理");
- //通过代理类调用父类中的方法
- Object result = proxy.invokeSuper(obj, args);
- System.out.println("后置代理");
- return result;
- }
- }
具体实现类:
- public class DoCGLib {
- public static void main(String[] args) {
- CglibProxy proxy = new CglibProxy();
- //通过生成子类的方式创建代理类
- SayHello proxyImp = (SayHello)proxy.getProxy(SayHello.class);
- proxyImp.say();
- }
- }
输出结果:
- 前置代理
- hello everyone
- 后置代理
CGLib创建的动态代理对象性能比JDK创建的动态代理对象的性能高不少,但是CGLib在创建代理对象时所花费的时间却比JDK多得多,所以对于单例的对象,因为无需频繁创建对象,用CGLib合适,反之,使用JDK方式要更为合适一些。同时,由于CGLib由于是采用动态创建子类的方法,对于final方法,无法进行代理。
CGLib动态代理原理及实现相关推荐
- CGLib动态代理原理
CGLib动态代理原理 CGLib动态代理是代理类去继承目标类,然后重写其中目标类的方法啊,这样也可以保证代理类拥有目标类的同名方法: 看一下CGLib的基本结构,下图所示,代理类去继承目标类,每次调 ...
- 【java】CGLIB动态代理原理分析
1.概述 前一篇文章介绍了CGLIB中常用的API,实际上使用了Enhancer和MethodInterceptor之后会生成代理子类,这篇文章就是分析一下CGLIB动态代理的原理. 2.CGLIB动 ...
- JDK和CGLIB动态代理原理
JDK动态代理原理解析 一.例子: 1.定义基础接口 public interface HttpApi {String get(String url); } 2.实现类 public class Re ...
- 深入理解Java Proxy和CGLIB动态代理原理
点击上方关注,每天进步一点点 动态代理在Java中有着广泛的应用,比如Spring AOP,Hibernate数据查询.测试框架的后端mock.RPC,Java注解对象获取等.静态代理的代理关系在编译 ...
- Java Proxy和CGLIB动态代理原理
动态代理在Java中有着广泛的应用,比如Spring AOP,Hibernate数据查询.测试框架的后端mock.RPC,Java注解对象获取等.静态代理的代理关系在编译时就确定了,而动态代理的代理关 ...
- 【java】CGLIB动态代理原理
文章目录 1. 简介 2. 示例 3. 原理 4. JDK动态代理与CGLIB动态代理区别(面试常问) 1. 简介 CGLIB的全称是:Code Generation Library. CGLIB是一 ...
- 动态代理——CGLIB动态代理原理示例解析
觉得可以的话点个关注,转个发呗,陆续奉上干货~~~~ 前文我们讲解了JDK动态代理的原理(动态代理--JDK动态代理原理),今天我们来看看CGLIB动态代理是如何实现,最后我们总结下JDK动态代理和C ...
- JDK和cglib动态代理原理详解
AOP的基础是Java动态代理,了解和使用两种动态代理能让我们更好地理解 AOP,在讲解AOP之前,让我们先来看看Java动态代理的使用方式以及底层实现原理. 转自https://www.jiansh ...
- 【动态代理】CGLIB 动态代理的使用及原理
1. CGLIB 动态代理介绍 什么是 CGLIB? CGLIB是一个功能强大,高性能的代码生成包.它为没有实现接口的类提供代理,为JDK的动态代理提供了很好的补充. 通常可以使用Java的动态代理创 ...
最新文章
- 008 centos7安装docker ce
- 检查oracle安装,oracle安装前环境检查
- 网站故障排查常用命令
- 如何实现分类表统计数目和详情表数量同步
- 重磅发布!阿里云云效《阿里巴巴DevOps实践指南》
- java1.5特性_JDK核心API:Java1.5语言新特性简单总结
- Builder Pattern 在 Objective-C 中的使用
- STL总结 (C++)
- linux 将远程mysql复制,在线备份MySQL及远程copy到远程备份服务器shell脚本
- mybatis_user_guide(6) Java API
- point-position2修改版
- Subversion服务器搭建 (安装步骤)
- 解决织梦(DedeCMS)系统自定义字段图片调用问题
- vrpie在Visio Studio 中无法调试的问题
- 数学知识点回顾(三)
- SylixOS 启动时mmu 初始化
- 项目管理实践_8Manage:保险行业的项目管理实践
- Android Canvas.DrawLine绘制线段
- 触摸板不小心卸载,触摸板重装,触摸板没有开关选项
- 修改Sublime Text 默认*.sublime-package文件
热门文章
- pandas mysql index_Pandas从入门到精通(3)- Pandas多级索引MultiIndex
- Python 装饰器详解(下)
- einops和einsum:直接操作张量的利器
- oracle错误1327,Oracle中的PGA监控报警分析(r11笔记第97天)
- atomikosdatasourcebean mysql_SpringBoot2整合JTA组件实现多数据源事务管理
- 多主机推送公钥、修改配置、修改密码脚本
- Angular Web App部署Ubuntu Nginx
- swing皮肤包 substance
- 用Emit技术替代反射
- ASP.NET Core Docker Jenkins 零基础持续集成实战