首页 > 其他分享 >对不实现接口的类进行动态代理,用cglib

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

时间:2024-09-19 16:46:50浏览次数:8  
标签:cglib 创建 代理 接口 proxy CGLIB method

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 在需要为具体类创建动态代理并添加额外行为时非常有用。

标签:cglib,创建,代理,接口,proxy,CGLIB,method
From: https://www.cnblogs.com/zqlmianshi/p/18420910

相关文章

  • 如何用Python将HTTP接口封装成可视化页面。
        在软件行业中,经常会遇到有一些功能只能通过接口触发,没有页面。这样很不方便,。我们这里,就是通过PyQt5实现,将接口的入参,封装成一个可视化的表单。将用户在表单中填写的数据,传给接口,接口再带参请求业务 1.先看最终的效果,用户打开桌面应用后,只会出现下面的弹窗, 接口......
  • mybatis 通过工厂模式将mapper接口的代理对象注入spring容器中
    MapperFactoryBean是MyBatis框架中用于创建Mapper对象的一个工厂类。getObject方法是该工厂类中的一个关键方法,用于返回实际的Mapper对象。具体来说,MapperFactoryBean通过getObject方法来创建和初始化Mapper接口的实现,从而可以在Spring容器中注入和使用这些Mappe......
  • 【C1N短网址】短链接API接口汇总
    C1N短网址(c1n.cn)提供了多个短链接API接口,对于有开发能力的用户或者企业来说,简直是一大福音。只需进行简单的代码编辑,就能将稳定好用的短链接系统接入到自己的产品中,极大地降低了开发成本。接下来看看都有哪些接口吧~1、生成短链API调用这个接口,可以将原始链接轻松生成短......
  • Python量化分析2024年最新整理的免费获取股票数据接口集合以及API数据接口说明文档
    ​近一两年来,股票量化分析逐渐受到广泛关注。而作为这一领域的初学者,首先需要面对的挑战就是如何获取全面且准确的股票数据。因为无论是实时交易数据、历史交易记录、财务数据还是基本面信息,这些数据都是我们进行量化分析时不可或缺的宝贵资源。我们的核心任务是从这些数据......
  • vue/配置axios(前后端数据连通/api接口的调用)
    1.创建apis文件2.写入调用的api地址且暴露出去。importhttpInstancefrom'@/utils/http';exportfunctiongetHomeNav(){returnhttpInstance({url:'http://10.0.11.91:91/dailyreport/getdailyreportall',})}3.创建文件编写拦截器 代码部分//axio......
  • 获得shopee商品详情API接口实现精细化运营
    Shopee是一个在线购物平台,隶属于东南亚地区的一家电商公司。该平台在东南亚多个国家拥有广泛的用户基础,包括新加坡、马来西亚、泰国、印度尼西亚、菲律宾、越南和台湾等。Shopee致力于打造一个多类别的产品市场,涵盖时尚、家居、美妆、电子产品、家电、玩具等多个领域,满足消费者的多......
  • 怎么使用Nginx反向代理Rancher
    环境查看系统环境#cat/etc/redhat-releaseRockyLinuxrelease9.4(BlueOnyx)#uname-a#1SMPPREEMPT_DYNAMICThuSep1218:24:53UTC2024x86_64x86_64x86_64GNU/Linux软件环境#nginx-versionnginxversion:nginx/1.26.2Nginx配置文件已经搭建好R......
  • IIS+Ngnix+Tomcat 部署网站 用IIS实现反向代理
     文中所用到的软件可在此下载。 https://download.csdn.net/download/xingchengaiwei/897337881、当我在一台服务器中部署多个网站时遇到了这样的情况,一台WindowsServer2016 服务器上要部署多个APS.NET网站,还需要部署一套Tomcat。Tomcat网站使用的是Ngnix代理,80端口已经......
  • 怎么使用nginx把80端口代理到想要的端口?
    最近研究了一下云服务器搭建Halo博客,为了好好体验开发者的快乐,所以我把之前装的Hexo博客直接干掉了,重装了系统,宝塔面板也决定弃用。因为使用宝塔面板虽然能省不少事,但是没了宝塔还活不了了?这可不行,所以决定自己配置,下面来看看URL搜索怎么绑定的吧:前提是域名和公网IP已经绑......
  • 设计模式之——代理模式
    代理模式前言:我们一般在租房子时会去找中介,为什么呢?因为你对该地区房屋的信息掌握的不够全面,希望找一个更熟悉的人去帮你做;再比如我们打官司需要请律师,因为律师在法律方面有专长,可以替我们进行操作,表达我们的想法;再比如在淘宝上面买东西,你使用支付宝平台支付,卖家请物流公司发货,......