首页 > 其他分享 >JDK 动态代理和 CGLib 动态代理区别

JDK 动态代理和 CGLib 动态代理区别

时间:2024-09-07 15:51:53浏览次数:9  
标签:enhancer JDK 代理 接口 CGLib 动态

1. 代理方式

  • JDK 动态代理

    • 只支持接口代理。它通过反射机制生成一个实现了指定接口的代理类。
    • 代理对象只能调用接口中定义的方法。
  • CGLib 动态代理

    • 通过继承方式生成代理类。它可以代理没有实现接口的类。
    • 代理对象可以调用类中的所有方法(除了final方法)。

2. 性能

  • JDK 动态代理

    • 由于是基于接口的代理,相对简单,性能较好。
  • CGLib 动态代理

    • 由于需要生成一个子类,性能相对较低,但在许多情况下仍然足够快。

3. 使用场景

  • JDK 动态代理

    • 适用于需要代理接口的场景,特别是在 Spring AOP 中,通常使用 JDK 动态代理来处理接口。
  • CGLib 动态代理

    • 适用于需要代理具体类的场景,尤其是在类没有实现接口时。CGLib 也常用于需要对类进行增强的情况。

4. 代理对象的创建

  • JDK 动态代理

    • 使用java.lang.reflect.Proxy类创建代理对象。
    MyInterface proxy = (MyInterface) Proxy.newProxyInstance(
        MyInterface.class.getClassLoader(),
        new Class<?>[]{MyInterface.class},
        new MyInvocationHandler(realObject)
    );
    
  • CGLib 动态代理

    • 使用net.sf.cglib.proxy.Enhancer类创建代理对象。
    Enhancer enhancer = new Enhancer();
    enhancer.setSuperclass(MyClass.class);
    enhancer.setCallback(new MyMethodInterceptor());
    MyClass proxy = (MyClass) enhancer.create();
    

5. 代理类的生成

  • JDK 动态代理

    • 生成的代理类在运行时创建,内存占用相对较小。
  • CGLib 动态代理

    • 生成的代理类是一个子类,可能会占用更多内存。

参考:ChatGPT

标签:enhancer,JDK,代理,接口,CGLib,动态
From: https://www.cnblogs.com/Higurashi-kagome/p/18401798

相关文章

  • 深入理解动态内存(一):动态内存使用常见问题
    目录对NULL指针的解引用操作对动态开辟空间的越界访问对非动态开辟内存使用free释放使用free释放⼀块动态开辟内存的⼀部分对同⼀块动态内存多次释放动态开辟内存忘记释放(内存泄漏)对NULL指针的解引用操作#include<stdio.h>#include<stdlib.h>intmain(){ int*p......
  • JAVA线程池监控以及动态调整线程池
    1背景Java线程池源码分析 里虽然介绍了线程池的核心配置(核心线程数、最大线程数和队列大小)该如何配置,但是实际上业界也没有一个统一的标准。虽然有些所谓的"公式",但是不同的业务场景复杂多变,配置原则也不尽相同。从实际经验来看,IO密集型、CPU密集型应用在线程配置上就比较悬殊,因......
  • PART1-Oracle关系数据结构-数据字典与动态性能视图
    6.数据字典与动态性能视图6.1.数据字典概述Oracle数据库的一个重要组成部分是其数据字典,这是一个只读的表集合,提供了有关数据库的管理元数据。数据字典包含如下信息:数据库中每个模式对象的定义,包括列的默认值和完整性约束信息分配给模式对象的空间量以及当前使用的量Oracl......
  • 【待做】【Linux系列】使用fail2ban配置动态防火墙
    一、安装二、测试三、基本配置四、相关命令原创戒一双LINUX开源玩家前面说的防火墙基本是静态的情况,在实际运行中我们可能需要动态调整防火墙策略,此时可以考虑使用Fail2ban。Fail2ban可以通过创建规则,自动更改防火墙配置,在尝试登录失败达到一定次数后禁止特定IP,......
  • 识别并应对动态归纳类算法题:深入剖析与实战指南
    《识别并应对动态归纳类算法题:深入剖析与实战指南》在编程的世界里,算法题犹如一座座充满挑战的山峰,等待着开发者们去攀登。其中,动态归纳类算法题因其复杂性和灵活性,常常成为开发者们进阶路上的一道难关。本文将深入探讨如何识别并应对动态归纳类算法题,为大家提供一份全面的......
  • C语言-第七章:字符和字符串函数、动态内存分配
    传送门:C语言-第六章-加餐:其他自定义类型目录第一节:字符和字符串函数    1-1.strlen函数和sizeof关键字    1-2.memcpy内存拷贝函数    1-3.memmove内存拷贝函数    1-4.memset内存设置函数    1-5.strtok字符串切割函数......
  • vue中的数据代理
    在Vue中,数据代理是一种重要的机制,它使得开发者能够更方便地访问和操作数据。一、数据代理的概念数据代理是指通过一个对象代理对另一个对象的访问。在Vue中,数据代理主要是通过Vue实例来代理对数据对象的访问。当创建一个Vue实例时,可以传入一个数据对象,Vue会将这个数......
  • elementplus vue3 table表格动态合并单元格
    letcellList:any[]=[]//单元格数组letcount:number=0//计数constcomputeCell=(tableList:any[],name)=>{cellList=[]count=0for(leti=0;i<tableList.length;i++){if(i===0){//先设置第一项cellList.push(1)......
  • 若依框架登录鉴权详解(动态路由)
     编辑若依框架登录鉴权:1.获取token(过期在响应拦截器中实现),2.基于RBAC模型获取用户、角色和权限信息(在路由前置守卫),3.根据用户权限动态生成(从字符串->组件,根据permission添加动态路由信息)和添加路由addRoutes(在路由前置守卫)若依框架(Ruoyi)后端的登录权限身份认证流程是一个复杂但高......
  • 在实际开发中,经常会遇到跨域问题,而使用 Nginx 作为代理服务器是一种有效的解决跨域问
    在实际开发中,经常会遇到跨域问题,而使用Nginx作为代理服务器是一种有效的解决跨域问题的方法。以下是关于如何使用Nginx代理服务解决跨域问题的详细介绍: 一、跨域问题的产生 当一个网页的脚本试图访问来自不同源(域名、协议或端口不同)的资源时,就会发生跨域问题。浏览器出......