当前位置: 首页 > news >正文

网站的站点建设分为android开发软件下载

网站的站点建设分为,android开发软件下载,北京网站建设营销,程序开发的步骤文章目录 前言技术积累核心概念主要功能适用场景与JDK动态代理的对比 实战演示定义待代理的目标类实现MethodInterceptor接口使用代理对象 测试结果写在最后 前言 在Java编程中,CGLIB (Code Generation Library) 是一个强大的高性能代码生成库,它通过生…

文章目录

    • 前言
    • 技术积累
      • 核心概念
      • 主要功能
      • 适用场景
      • 与JDK动态代理的对比
    • 实战演示
      • 定义待代理的目标类
      • 实现MethodInterceptor接口
      • 使用代理对象
    • 测试结果
    • 写在最后

前言

在Java编程中,CGLIB (Code Generation Library) 是一个强大的高性能代码生成库,它通过生成被代理类的子类来实现代理功能。相比于JDK动态代理要求目标对象必须实现接口,CGLIB代理适用于那些没有实现任何接口的类。其实动态代理在编码中有很多的使用场景,如方法拦截、权限检查、事务管理、日志记录等等。今天我们就简单分享一期用CGLIB动态代理来扩展类功能。

技术积累

核心概念

  1. 动态代理: 动态代理是一种设计模式,允许在运行时创建一个对象,该对象可以充当其他对象(目标对象)的代理,从而控制对目标对象方法的访问。代理对象在转发请求到目标对象的同时,可以附加额外的行为,如方法拦截、权限检查、事务管理、日志记录等。
  2. 字节码操作: CGLIB基于底层的字节码操作技术,利用ASM库动态生成新的Java类(通常是目标类的子类)。这些新生成的类继承自目标类,并在方法调用时插入代理逻辑。这种机制使得CGLIB能够在不修改原有类代码的情况下,为其提供增强功能

主要功能

  1. 方法拦截: CGLIB的核心功能是实现方法级别的拦截。通过实现MethodInterceptor接口,开发者可以定义一个方法拦截器,该拦截器会在代理对象的方法调用前后执行自定义逻辑,如预处理、后处理、异常处理、结果修饰等。
  2. 非接口代理: 与JDK动态代理依赖接口不同,CGLIB可以直接对未实现任何接口的普通Java类进行代理。这意味着无论目标类是否声明了接口,都可以使用CGLIB进行代理,极大地拓宽了其适用范围。
  3. 性能优化: 虽然字节码操作会带来一定的开销,但CGLIB通过高效地生成和缓存代理类,确保了在大多数情况下具有良好的性能。尤其对于频繁创建和销毁代理对象的场景,CGLIB的单例模式表现往往优于JDK动态代理。

适用场景

  1. AOP框架: 面向切面编程(Aspect-Oriented Programming, AOP)常借助CGLIB来实现方法拦截和织入切面逻辑。Spring框架在内部就集成了CGLIB,用于当目标对象未实现接口时的代理实现。
  2. 服务端框架: 在某些服务端开发框架(如Hibernate、MyBatis等)中,CGLIB被用来创建持久化对象的代理,以透明地支持延迟加载、变更检测等功能。
  3. 测试工具: 在单元测试或集成测试中,CGLIB可用于模拟复杂的对象交互,为测试提供灵活的隔离环境。

与JDK动态代理的对比

尽管两者都服务于动态代理需求,但CGLIB与JDK动态代理有明显的差异:

  1. 代理方式:
    JDK动态代理基于接口,创建代理对象时需要目标对象实现至少一个接口。代理对象是接口的实现类,通过反射调用接口方法。
    CGLIB代理基于子类,能够代理未实现接口的类。代理对象是目标类的子类,通过继承和方法覆写实现拦截。
  2. 性能考量:
    对于仅需代理接口方法且创建代理对象频率较低的场景,JDK动态代理通常拥有更好的性能,因为它不需要生成额外的类文件,也不涉及字节码操作。
    在需要代理非接口类或频繁创建销毁代理对象的情况下,CGLIB由于其高效的字节码生成和缓存策略,可能会表现出更优的性能。
  3. 应用限制:
    JDK动态代理由于依赖接口,无法应用于未声明接口的类。同时,对于final类和方法,以及带有final修饰符的成员变量,JDK动态代理无能为力。
    CGLIB理论上可以代理任何非final类,但对于final类、final方法以及构造函数,CGLIB同样无法进行代理。

实战演示

定义待代理的目标类

首先,创建一个不实现任何接口的ActionUserDataServiceImpl 类,它是我们将要进行CGLIB代理的实际业务逻辑实现。

/*** ActionUserDataServiceImpl* @author senfel* @version 1.0* @date 2024/4/3 16:11*/
public class ActionUserDataServiceImpl {/*** addUser* @author senfel* @date 2024/4/3 16:36* @return void*/public void addUser() {System.out.println("实际执行增加用户的操作...");}
}

实现MethodInterceptor接口

为了拦截并处理目标方法调用,我们需要实现net.sf.cglib.proxy.MethodInterceptor接口,其中的核心方法是intercept()。在这个方法中,你可以添加额外的逻辑,如前置处理、后置处理、异常处理或完全替换原有的方法行为。

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;/*** StudentProxy* @author senfel* @version 1.0* @date 2024/4/3 16:27*/
public class MyCglibProxy<T> implements MethodInterceptor {/*** getProxyInstance* @author senfel* @date 2024/4/3 16:27* @return java.lang.Object*/public Object getProxyInstance(Class<T> tClass)  {Enhancer enhancer = new Enhancer();enhancer.setSuperclass(tClass);enhancer.setCallback(this); // 设置回调方法为当前类return enhancer.create();}@Overridepublic Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {System.out.println("开始执行代理逻辑...");// 前置处理或其他逻辑beforeProxyRun();// 调用原始方法(即目标方法)Object result = proxy.invokeSuper(obj, args);// 后置处理或其他逻辑afterProxyRun();System.out.println("结束执行增代理逻辑...");return result;}/*** beforeProxyRun* @author senfel* @date 2024/4/3 16:33* @return void*/private void beforeProxyRun() {System.out.println("代理前:执行一些预处理操作...");}/*** afterProxyRun* @author senfel* @date 2024/4/3 16:33* @return void*/private void afterProxyRun() {System.out.println("代理后:执行一些后续处理操作...");}
}

使用代理对象

最后,通过代理类的getProxyInstance()方法获取代理对象,并调用其方法以观察代理效果。

import com.example.ccedemo.proxy.MyCglibProxy;
import com.example.ccedemo.service.ActionUserDataServiceImpl;/*** CglibProxyTest* @author senfel* @version 1.0* @date 2024/4/3 16:29*/
public class CglibProxyTest {public static void main(String[] args) {MyCglibProxy<ActionUserDataServiceImpl> actionUserDataServiceMyCglibProxy = new MyCglibProxy<>();ActionUserDataServiceImpl actionUserDataService = (ActionUserDataServiceImpl)actionUserDataServiceMyCglibProxy.getProxyInstance(ActionUserDataServiceImpl.class);actionUserDataService.addUser();}
}

测试结果

开始执行代理逻辑…
代理前:执行一些预处理操作…
实际执行增加用户的操作…
代理后:执行一些后续处理操作…
结束执行增代理逻辑…

在这里插入图片描述

写在最后

以上就是一个完整的Java CGLIB动态代理实例。通过这个例子,可以看到我们成功地对ActionUserDataServiceImpl 类进行了代理,代理过程中插入了额外的前后置处理逻辑,而无需修改原有类的代码。在实际使用时,我们应根据项目需求和目标类特性选择合适的代理方案,不仅仅限制于CGLIB,如果有实现接口的类用JDK也可,这样才能达到事半功倍的效果。

http://www.yayakq.cn/news/355368/

相关文章:

  • 建设一个收入支出持平的网站工地模板
  • 河南南阳油田网站建设自己买个服务器做网站
  • 网站规划怎么做做网站好
  • .win域名做网站怎么样上海本土互联网公司
  • 群艺馆网站建设方案网站建设公司新员工培训ppt
  • 武威做网站网站建设合同模板下载
  • 网站排名英文wordpress 小影
  • 服务器禁止ip访问网站微信公众号 小程序
  • 丹东淘宝做网站网站建设的发展目标
  • 做网站前端程序员舟山市建设工程造价管理协会网站
  • 住房建设厅网站开工作室做网站怎样找资源
  • 企业官网建站联系我们ps毕业设计做网站界面
  • 公司网站制作的公司网站建设公司好做吗
  • 电脑网站开发学习网站设计课程总结
  • 模板网站可以做优化做产地证需要备案上哪个网站
  • 家居行业网站建设网站建设中的咨询服务
  • 郑州市建设工程造价信息网站一个人开发一个网站需要多久
  • 网站建设的相关技术方案网站托管服务适用于哪种类型的网站
  • 简单的做图网站海安县建设局网站
  • php源码网站后台面密码忘了在哪能找回密码云南小程序开发制作公司
  • wordpress 手工升级关键词优化ppt
  • 四大商业网站网站建设贰金手指下拉壹玖
  • 关于做情侣的网站的图片网站访问工具
  • 企业网站的建设有哪些经典问题坪山网站建设信息
  • 企业网站制作费做分录网络营销的特点中任何时间任何地点体现的是
  • 我的专业网站建设策划书如何创建小程序
  • html5网站抓取建设网站的意义作用是什么
  • 深圳建站公司有推荐的公司吗小程序电商平台排名
  • 网站建设seo策略互联网软件有哪些
  • 福州网站大全个人网站备案怎么做