网站首页 > 博客文章 正文
cglib动态代理:静态代理和jdk动态代理都是要求目标对象实现接口。但有时候目标对象是单独的对象,并没有实现任何接口,这个时候就可以使用目标对象子类的方式实现代理。
Cglib:(Code Generation Library)也叫子类代理,它是在内存中构建一个子类对象从而实现对目标对象功能的扩展。是基于asm框架,实现了无反射机制进行代理,利用空间换取时间,代理效率高于jdk动态代理。
Cglib:是一个强大高性能代码生成包,它可以在运行期间扩展java类及实现接口。被许多AOP框架使用,如Spring AOP和synaop提供方法的interception拦截。
Cglib子类动态代理实现方法:(1) 引入cglib的jar包,但是spring核心包中已包含了cglib功能,所以直接引入spring-core.5.3.13.jar即可 (2) 引入功能后,就可以在内存中动态构建子类 (3) 代理的类不能为final否则报错 (4) 目标对象的方法如果为final/static那么就不会被拦截。
Cglib核心类:(1)Enhancer主要的增强类,是Cglib常用类和Proxy差不多,不同的是Enhancer既然代理普通的class也能够代理接口,创建被代理类的子类并且拦截所有方法调用(包括从Object继承的toString和hashcode方法)不能够拦截final方法和操作final类。(2)MethodInterceptor 主要的方法拦截类,需要用户实现,是通用的回调(callback)类型,它经常被AOP用来实现拦截(intercept)方法调用,这个接口只定义了一个方法。public Object intercept(Object proxy, Method method, Object[] params, MethodProxy methodProxy)参数:proxy被代理对象 method 执行的方法 params 方法中的参数,methodProxy代理的方法。
/**
* @date: 2022/6/4 20:38
* @desc: 被代理对象
*/
public class Say {
public void say() {
System.out.println("目标方法输出的内容");
}
}
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
/**
* @date: 2022/6/5 08:53
* @desc: cglib动态代理
*/
public class ProxyFactory implements MethodInterceptor {
private Object targetObj;
public ProxyFactory(Object targetObj_){
targetObj = targetObj_;
}
public Object createInstance() {
// 增强类,设置父类,设置回调
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(targetObj.getClass());
enhancer.setCallback(this);
return enhancer.create();
}
public Object intercept(Object o, Method method, Object[] params, MethodProxy methodProxy) throws Throwable {
System.out.println("日志开始");
Object obj = methodProxy.invoke(targetObj, params);
System.out.println("日志结束");
return obj;
}
}
// 测试代码
Say say = (Say) new ProxyFactory(new Say()).createInstance();
say.say();
maven依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.3.13</version>
</dependency>
猜你喜欢
- 2025-01-07 Spring Native 0.10.0 发布,重大突破
- 2025-01-07 揭秘AOP和动态代理技术,一次扒个清楚,哪还有神秘可言?
- 2025-01-07 三天学会使用MyBatis,绝对干货,只实战,不学究
- 2025-01-07 java agent技术原理及简单实现
- 2025-01-07 掌握Spring AOP的底层实现与高级配置,优化面向切面编程
- 2025-01-07 动态代理竟然如此简单
- 2025-01-07 Java Agent探针的技术
- 2025-01-07 Java 反射以及动态代理,来看就懂了
- 2025-01-07 搞懂Java三种代理模式:静态代理、动态代理和cglib代理
- 2025-01-07 面试造火箭系列,栽在了cglib和jdk动态代理
你 发表评论:
欢迎- 368℃用AI Agent治理微服务的复杂性问题|QCon
- 364℃手把手教程「JavaWeb」优雅的SpringMvc+Mybatis整合之路
- 358℃初次使用IntelliJ IDEA新建Maven项目
- 351℃Maven技术方案最全手册(mavena)
- 348℃安利Touch Bar 专属应用,让闲置的Touch Bar活跃起来!
- 347℃InfoQ 2024 年趋势报告:架构篇(infoq+2024+年趋势报告:架构篇分析)
- 345℃IntelliJ IDEA 2018版本和2022版本创建 Maven 项目对比
- 343℃从头搭建 IntelliJ IDEA 环境(intellij idea建包)
- 最近发表
- 标签列表
-
- powershellfor (55)
- messagesource (56)
- aspose.pdf破解版 (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- vue数组concat (56)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)