CGlib动态代理实战

本文介绍了CGlib动态代理库,它是对ASM的封装,用于在运行时生成和扩展Java类。文章对比了JDK动态代理的局限性,并详细讲解了如何使用CGLib实现方法拦截器和方法过滤器,以实现AOP编程,同时还给出了实际的代码示例。
摘要由CSDN通过智能技术生成

CGlib是什么

CGlib是一个强大的,高性能,高质量的Code生成类库。它可以在运行期扩展Java类与实现Java接口。
官方介绍:

cglib - Byte Code Generation Library is high level API to generate and transform Java byte code. It is used by AOP, testing, data access frameworks to generate dynamic proxy objects and intercept field access. https://github.com/cglib/cglib/wiki

当然这些实际的功能是ASM所提供的,ASM是一个Java字节码操控框架,官方介绍:

ASM is an all purpose Java bytecode manipulation and analysis
framework. It can be used to modify existing classes or dynamically
generate classes, directly in binary form. Provided common
transformations and analysis algorithms allow to easily assemble
custom complex transformations and code analysis tools.

具体可以去ASM官网详细了解:http://asm.ow2.org/
cglib封装了ASM,简化了ASM的操作,实现了在运行期动态生成新的class。
Spring aop底层实现就是CGlib;hibernate使用cglib动态生成VO/PO (接口层对象)。

一、JDK中的动态代理

JDK中的动态代理是通过反射类Proxy以及InvocationHandler回调接口实现的,对此不了解的同学可以参考InfoQ上的这篇博客:Java深度历险(七)——Java反射与动态代理
但是JDK中的动态代理有一个缺点:被动态代理的类必须要实现一个接口,也就是说只能对该类所实现接口中定义的方法进行代理,这在实际编程中具有一定的局限性,而且使用反射的效率也并不是很高。

二、CGLib实战

使用CGLib实现动态代理,完全不受代理类必须实现接口的限制,而且CGLib底层采用ASM字节码生成框架,使用字节码技术生成代理类,比使用Java反射效率要高。唯一需要注意的是,CGLib不能对声明为final的类进行代理,因为CGLib原理是动态生成被代理类的子类。
2.1 使用MethodInterceptor实现AOP
1) 首先,代理类UserDao

package com.ricky.cglib;

/**
 * 需要被代理的类
 * @author Ricky Fung
 *
 */
public class UserDao {
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值