对不实现接口的类进行动态代理,用cglib

news/2024/9/19 16:49:18/文章来源:https://www.cnblogs.com/zqlmianshi/p/18420910

CGLIB(Code Generation Library)是一个强大的、高性能的代码生成库,它用于在运行时生成 Java 字节码。CGLIB 主要用于创建动态代理对象,特别是那些不实现接口的类。与 Java 反射 API 提供的动态代理机制不同,CGLIB 可以代理具体类,而不仅仅是接口。

CGLIB 动态代理的原理
CGLIB 通过继承目标类并覆盖其方法来创建代理对象。它使用底层的 ASM 字节码操纵框架生成新的类。在这个新的代理类中,方法调用会被重写,以便在调用目标方法之前和之后插入额外的逻辑。

使用场景
CGLIB 常用于以下场景:

类没有实现接口:如果你想为一个没有实现任何接口的类创建代理对象,CGLIB 是一个很好的选择。
性能优化:CGLIB 生成的代理对象通常比 Java 的反射 API 提供的动态代理对象性能更高。
AOP(面向切面编程):许多 AOP 框架(如 Spring AOP)在需要为具体类创建代理时会使用 CGLIB。
CGLIB 动态代理的示例
以下是一个简单的使用 CGLIB 创建动态代理对象的示例:

添加依赖:
确保你的项目中包含 CGLIB 的依赖。对于 Maven 项目,可以在 pom.xml 文件中添加以下依赖:

xml
复制代码
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.3.0</version>
</dependency>
定义目标类:
创建一个没有实现任何接口的类。

java
复制代码
public class UserService {
public void addUser(String name) {
System.out.println("Adding user: " + name);
}
}
创建代理类:
使用 CGLIB 创建代理对象。

java
复制代码
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

public class CglibProxyExample {
public static void main(String[] args) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(UserService.class);
enhancer.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
System.out.println("Before method: " + method.getName());
Object result = proxy.invokeSuper(obj, args);
System.out.println("After method: " + method.getName());
return result;
}
});

UserService userServiceProxy = (UserService) enhancer.create();
userServiceProxy.addUser("John Doe");
}
}
在这个示例中:

Enhancer:CGLIB 提供的 Enhancer 类用于生成代理对象。
setSuperclass:指定要代理的目标类。
setCallback:设置回调对象,即 MethodInterceptor 的实现,用于拦截方法调用。
intercept 方法:在这个方法中,你可以定义在调用目标方法之前和之后要执行的逻辑。proxy.invokeSuper(obj, args) 调用目标类的原始方法。
创建代理对象:通过 enhancer.create() 创建代理对象。
当你调用 userServiceProxy.addUser("John Doe") 时,intercept 方法会拦截这个调用,你会看到输出:

复制代码
Before method: addUser
Adding user: John Doe
After method: addUser
通过 CGLIB,你可以在不修改现有类的代码的情况下,添加额外的行为(如日志记录、事务管理等)。这使得 CGLIB 在需要为具体类创建动态代理并添加额外行为时非常有用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/799945.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

9月26日云技术研讨会 | SOA整车EE架构开发流程及工具实施方案

本次研讨会经纬恒润将结合业务团队多年来在SOA架构开发和工具实施领域的项目实践经验,分享探讨SOA趋势下先进的整车EE架构开发模式,聚焦在SOA开发难点分析、开发阶段划分、开发工具链的适配与应用等内容。9月26日,我们在直播间期待您的参与! 面向服务的架构(Service…

服务的UUID

1. UUID 广播数据中,一般会包含一个UUID列表,用以展示自己支持的服务。但是GAP和GATT服务的UUID不能加到广播中。广播包中可以根据自身情况包含一部分服务的UUID或者包含所有服务的UUID。部分服务的UUID列表和完整的UUID列表只能包含一个。 什么情况下包含部分UUID?广播数据…

Common PyPI?

Skip to main contentTwo factor authentication is available, enable it now for your account.Search PyPISearch macnote Common questions BasicsWhats a package, project, or release? How do I install a file (package) from PyPI? How do I package and publish my…

Hackademic.RTB1 打靶记录

第一次打靶机,思路看的红队笔记https://www.vulnhub.com/entry/hackademic-rtb1,17/环境:kali Linux - 192.168.75.131,靶机 - 192.168.75.132 主机发现和端口扫描扫描整个网络有哪台机子在线,不进行端口扫描 nmap -sP 192.168.75.0/24 Starting Nmap 7.93 ( https://nmap.…

安装网站时出现“连接数据库出现数据库服务器或登录密码无效,无法连接数据库,请重新设定”解决方法

当你在安装网站时遇到“连接数据库出现数据库服务器或登录密码无效,无法连接数据库,请重新设定”的错误时,可以按照以下步骤来排查和解决这个问题。 排查步骤确认数据库连接信息:确认数据库服务器地址、用户名、密码、数据库名称等信息是否正确。 确认数据库服务器是否处于…

易优eyoucms网站二次验证密码忘记解决办法

当你忘记了易优CMS(EyouCMS)后台的二次验证密码时,可以通过修改数据库中的相关设置来绕过或重置这个验证。根据提供的记录信息,可以按照以下步骤来进行操作: 步骤登录数据库 修改相关设置 清除缓存详细步骤 1. 登录数据库 首先,你需要登录到你的MySQL数据库。你可以使用命…

mysql事务隔离级别和spring事务传播机制

一、事务并发会出现的三个问题 数据库事务具有ACID4个特性: A:Atomic,原子性,将所有SQL作为原子工作单元执行,要么全部执行,要么全部不执行; C:Consistent,一致性,事务完成后,所有数据的状态都是一致的,即A账户只要减去了100,B账户则必定加上了100; I:Isolation…

电商系统的简单设计

订单模块 作为电商系统,首入眼帘的就是订单模块,也是电商基础的模块之一。订单流程包含了订单从下单到完成的整个流程,订单的状态如下:这里迎来了第一个问题,可以看到订单状态有非常多种,如果用if else去做判断,逻辑会非常多,这时候就需要用到状态机模式了,状态机如何使…

限流器的实践

背景 我们有一个业务场景是给学生发布考试,发布的过程不复杂,就是一个老师传递一些考试相关的参数过来,服务器自动给所有学生生成一份任务,但是在学生上交的时候会有个问题,就是成百上千的学生一起上交,会有并发流量的问题。 这里由于我们的考试可能会设计多个班级的联考…

易优cms 数据库连接失败,如何重新进行正确配置

当你遇到易优CMS(EyouCMS)数据库连接失败的问题时,可以按照以下步骤进行正确的配置和故障排除。 1. 检查数据库配置文件 易优CMS的数据库配置文件位于 application/database.php。你需要检查并修改该文件中的数据库配置信息。 2. 核对数据库账号和密码 确保数据库账号和密码…

在Windows10中使用rust的diesel库

介绍 最近在学习Actix Web时,需要用到数据库操作,简单尝试了一下diesel,也遇到了一些问题。在这里记录一下,供大家参考。 1.安装 根据Diesel官网介绍,使用cargo binstall安装diesel cli。 cargo binstall diesel_cli如果报错 error: no such command: `binstall` 需要先安…

易优eyoucms网站无法安装,数据库文件版本号(无)与CMS源码版本号(v1.3.1)不一致,点击查看!

解决方法比较简单, 可以找历史版本, 使用同版本数据库或者源码进行安装, 安装完成后操作升级。扫码添加技术【解决问题】专注中小企业网站建设、网站安全12年。熟悉各种CMS,精通PHP+MYSQL、HTML5、CSS3、Javascript等。承接:企业仿站、网站修改、网站改版、BUG修复、问题处…