cglib代理

深入理解动态代理:JDK动态代理与CGLIB动态代理 动态代理是一种在运行时创建代理对象的技术,通过代理对象来控制对原对象的访问,能够在不修改原对象的情况下添加额外的功能。JDK动态代理:基于Java反射机制,只能代理实现了接口的类。CGLIB动态代理:基于字节码生成技术,可以代理没有实现接口的类。// 抽象主题接口动态代理在Java中提供了一种灵活而强大的机制,能够在运行时为目标对象添加额外的功能。JDK动态代理和CGLIB动态代理各有优势和适用场景,开发者可以根据具体需求选择合适的代理机制。希望这篇文章对你理解动态代理有所帮助。 阅读详情

一、cglib代理

cglib是一个强大、高性能的字节码生成库,它用于在运行时扩展Java类和实现接口;本质上它是通过动态的生成一个子类去覆盖所要代理的类(非final修饰的类和方法)。Enhancer可能是CGLIB中最常用的一个类,和jdk中的Proxy不同的是,Enhancer既能够代理普通的class,也能够代理接口。Enhancer创建一个被代理对象的子类并且拦截所有的方法调用(包括从Object中继承的toString和hashCode方法)。Enhancer不能够拦截final方法,例如Object.getClass()方法,这是由于Java final方法语义决定的。基于同样的道理,Enhancer也不能对final类进行代理操作。

二、实现

实体类

package com.sunshine.boot.proxy.cglib;

public class ServiceB {

    public void test1() {
        System.out.println("我是serviceB的test1方法");
        this.test2();
    }

    public void test2() {
        System.out.println("我是serviceB的test2方法");
    }

}

代理类

package com.sunshine.boot.proxy;

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * cglib动态代理类
 */
public class CglibProxyTest implements MethodInterceptor {

    /**
     * 目标对象
     */
    private Object target;

    public CglibProxyTest(Object target) {
        this.target = target;
    }

    /**
     * 代理对象方法拦截器
     * @param o 代理对象
     * @param method 被代理的类的方法,
     * @param objects 调用方法传递的参数
     * @param methodProxy 方法代理对象
     * @return
     * @throws Throwable
     */
    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("执行方法"+method.getName());
        System.out.println(method.getName()+"-before...");
        Object result = methodProxy.invokeSuper(o, objects);
        System.out.println(method.getName()+"-after...");
        return result;
    }

    public static <T> T createProxy(T target) {
        CglibProxyTest cglibProxyTest = new CglibProxyTest(target);
        Enhancer enhancer = new Enhancer();
        enhancer.setCallback(cglibProxyTest);
        enhancer.setSuperclass(target.getClass());
        return (T) enhancer.create();
    }
}

三、测试

package com.sunshine.boot.proxy;

import com.sunshine.boot.proxy.cglib.ServiceB;
import com.sunshine.boot.proxy.jdk.IService;
import com.sunshine.boot.proxy.jdk.ServiceA;

public class ProxyTest {

    public static void main(String[] args) {
        // jdk
//        IService proxyA = JDKProxyTest.createProxy(new ServiceA(), IService.class);
//        proxyA.test1();

        // cglib
        ServiceB proxy = CglibProxyTest.createProxy(new ServiceB());
        proxy.test1();
    }
}

结果:

执行方法test1
test1-before...
我是serviceB的test1方法
执行方法test2
test2-before...
我是serviceB的test2方法
test2-after...
test1-after...

从结果可以看出cglib可以代理test1方法中test2方法

LTspice基础教程-009.LTspice波形测量 <<==上一篇:LTspice基础教程-008.LTspice PWL设置 >>==下一篇:LTspice基础教程-010. 首篇博客文末提供所有相关资源百度网盘分享链接 阅读详情

相关推荐

Python爬虫实战:5分钟搞定Web of Science文献批量导出与解析(附完整代码)

本文提供了一套利用Python爬虫技术,快速实现Web of Science文献批量提取与解析的完整方案。通过解析官方导出的HTML文件,结合BeautifulSoup和pandas库,可将文献数据自动转换为结构化的Excel/CSV表格,帮助科研人员高效管理文献信息,节省大量手动整理时间。

weixin_29050513的博客 1166

CGLIB动态代理详解分析

CGLIB是强大的、高性能的代码生成库,被广泛应用于AOP框架,它底层使用ASM来操作字节码生成新的类,为对象引入间接级别,以控制对象的访问。CGLIB相比于JDK动态代理更加强大,JDK动态代理只能对接口进行代理,而CGLIB既可以代理普通类,也能够代理接口。

weixin_43397326的博客 6589

Vue3 视频播放器完整指南 – @videojs-player/vue 从入门到精通

全面解析 Vue3 生态中最强大的视频播放解决方案 @videojs-player/vue。从基础安装到高级功能,涵盖自动播放、直播流、字幕支持等核心特性。提供完整的代码示例和最佳实践,助你快速构建专业的视频播放应用。

前端开发-前端技术分享 1423

cglib动态代理

CGLIB(Code Generation Library),是一个强大的,高性能,高质量的 Code 生成类库,它可以在运行期扩展 Java 类与实现 Java 接口。

NCS123456的博客 1万+

Avellaneda & Stoikov’s market-making strategy 工程化处理

前2篇文章详细介绍了AS存货模型的做市策略,这次对于这些公式里面一些希腊字母的取值是如何计算的,如何做工程化并应用到生产环境中做一些说明。这个里面有一些重要参数:很直观,可以直接取值的有:s = current market mid price (中间价,也就是【最佳卖价+最佳买价】/2)q = quantity of assets in inventory of base asset (也就是买入多少价值的股票数量)

weixin_42480337的博客 7070

安卓APP通过CH340实现USB串口通信与设备检测

本文详细介绍了安卓APP通过CH340芯片实现USB串口通信与设备检测的完整流程。从CH340芯片的基础原理到开发环境搭建,再到串口通信的具体实现和错误处理,提供了全面的技术指导。文章还分享了USB热插拔处理、自动重连策略以及性能优化等实战技巧,帮助开发者高效完成安卓与嵌入式设备的通信开发。

weixin_42531925的博客 380

动态代理模式 -- Cglib代理

静态代理和 JDK 代理模式都要求目标对象是实现一个接口,但是有时候目标对象只是一个 单独的对象,并没 有实现任何的接口,这个时候可使用目标对象子类来实现代理-这就是 Cglib 代理Cglib代理也叫作 子类代理,它是在内存中构建一个子类对象从而实现对目标对象功能扩展, 有些书也将Cglib代理归属到动态代理。Cglib 是一个强大的高性能的代码生成包,它可以在运行期扩展 java 类与实现 java 接口.它广泛的被许多 AOP 的框架使用,例如 SpringAOP,实现方法拦截。

weixin_43739348的博客 1977

伺服系统控制原理深度解析

摘要:本文系统阐述了伺服系统的控制原理与应用。首先介绍了伺服系统的定义、组成及其在工业自动化中的重要性;然后详细分析了反馈控制机制、稳定性判据和性能指标;重点推导了传递函数和状态空间两种数学模型,并通过LaTeX公式展示了二阶系统建模过程;进而对比了PID控制、状态反馈及自适应控制等方法的优缺点;最后结合数控机床等案例,验证了理论方法的有效性,并展望了伺服系统智能化发展趋势。全文兼顾理论深度与实践指导性,为控制工程领域提供了系统的技术参考。

技术工作者 1267

Spring AOP 实现原理详解之 CGLIB 动态代理

CGLIB 是一个强大的高性能的代码生成包。它广泛的被许多 AOP 的框架使用,例如 Spring AOP 和 dynaop,为他们提供方法的 interception(拦截)。CGLIB 包的底层是通过使用一个小而快的字节码处理框架 ASM,来转换字节码并生成新的类。除了 CGLIB 包,脚本语言例如 Groovy和 BeanShell,也是使用 ASM 来生成 Java 的字节码。当然不鼓励直接使用 ASM,因为它要求你必须对 JVM 内部结构包括 class 文件的格式和指令集都很熟悉。引入 CGLI

流华追梦的专栏 2548

【网络安全】SSRF漏洞讲解

SSRF漏洞讲解一、初识SSRF漏洞1.定义2.产生原理3.会导致的危害4.常见产生SSRF的地方5.常见缺失函数二、SSRF漏洞利用1.函数(1) file_get_contents(2)fsockopen()(3) curl_exec()2.协议(1)file协议(2)http协议(3)dict协议(4)gopher协议三、绕过1.绕过方式(1)检查IP是否为内网IP(2)Host获取与DNS绕过(3)通过各种协议(4)利用URL解析器滥用问题四、修复修复方案五、小结 一、初识SSRF漏洞 1.定义

你在看屏幕的同时,屏幕也在注视着你 3181

神经形态芯片:IBM TrueNorth技术详解以及应用案例

2018年的一项演示中,机器人使用TrueNorth处理了复杂的路径规划,功耗仅为传统系统的1/10。它通过模仿人脑的结构,解决了传统芯片在功耗和并行性上的痛点,并在图像识别、物联网和机器人等领域展现了强大潜力。:不同于传统芯片的时钟驱动,TrueNorth是事件驱动的。例如,工厂中的振动传感器使用TrueNorth检测设备故障的早期迹象,实现了更高效的维护策略,避免了停机时间。:在医疗领域,TrueNorth可以用于可穿戴设备,比如一个智能助听器,它能过滤噪音并增强特定声音,功耗低到可以用纽扣电池供电。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 2477

动态代理之 cglib 实现

(尊重劳动成果,转载请注明出处:https://blog.youkuaiyun.com/qq_25827845/article/details/87513102冷血之心的博客) 目录 前言: 正文: AOP(面向切面编程) JDK动态代理 cglib实现动态代理 cglib包结构: cglib动态代理相关的基础类: cglib动态代理Demo 总结: 前言:         这篇文...

冷血之心的博客 9287

vue接入海康4G版摄像头通过萤石云平台推送视频流教程

vue-video-player接入海康视频,videojs-contrib-hls,vue播放视频

renkai721的专栏 7279

Cglib代理实现

CgLib是一个强大的、高性能的代码生成包,被许多AOP框架所使用,为他们提供方法的拦截最底层的是字节码ASM是操作字节码的工具CgLib基于ASM字节码工具操作字节码(即动态生成代理,对方法进行增强)SpringAOP基于CgLib进行封装,实现CgLib方式的动态代理。

杰尼龟的小龟壳的博客 732

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

CGLIB 动态代理

目录 CGLIB 动态代理 简单结构: 添加依赖 定义类 CGLIB 动态代理 JDK的动态代理机制只能代理实现了接口的类。而不能实现接口的类就不能使用JDK的动态代理,CGLIB是针对类来实现代理的,它的原理是对指定目标类生成一个子类,并覆盖其中的方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理。 简单结构: 实现原理:继承思想 代理类继承目标类,重写目标类中的方法, CGLIB像是一个拦截器,在调用我们的代...

m0_61609890的博客 7355

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

CGLIB动态代理

文章目录概述CGLIB组织结构CGLIB动态代理示例分析代理类分析FastClass 机制MethodProxy.invoke(Object obj, Object[] args)分析CGLIB动态代理碰到的问题问题1:异常Exception in thread "main" java.lang.NoClassDefFoundError: org/objectweb/asm/Type问题2问题3总结 概述 CGLIB是一个强大的、高性能的代码生成库。其被广泛应用于AOP框架(Spring、dynaop)中,

FromZeroJiYuan的博客 4186

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

JDK 代理和 CGLIB 代理

代理对象通常与真实对象实现相同的接口,并在调用真实对象的方法前后执行额外的操作。这两种都是 Java 中实现动态代理的常用方式,它们允许你在运行时创建代理对象,以便在调用真实对象的方法时插入额外的逻辑,例如日志记录、性能监控、事务管理等,而无需修改原始类的代码。代理类通常会持有真实对象的引用,并在其方法中调用真实对象的方法,同时添加额外的逻辑。JDK 代理和 CGLIB 代理是 Java 中实现动态代理的两种主要方式,各有优缺点。Java 提供了两种主要的动态代理机制:JDK 代理和 CGLIB 代理。

m0_69529796的博客 1302

Java中的静态代理,JDK代理和CGLIB代理的区别

静态代理就是常用的聚合方式,这种方式用来代理很简单,但是扩展性较差,如果需要代理多个方法,需要在代理类里把多个方法都写出来,而动态代理就没这种问题。 JDK代理是基于接口实现的,原理其实是动态生成一个子类去实现这个接口,所以需要代理的对象必须实现某个接口,并且需要代理的方法必须是接口里定义过的抽象方法。 CGLIB代理是基于类去实现的,当需要代理的类无法使用JDK代理的时候就可以使用CGLIB代理,另外需要代理的类必须不能使用final修饰,因为CGLIB实质上是通过继承需要代理的类,然后在子类中重写

qq_31860647的博客 2368

CGLib代理

CGLib代理 代理为控制要访问的目标对象提供了一种途径。当访问对象时,它引入了一个间接的层。JDK自从1.3版本开始,就引入了动态代理,并且经常被用来动态地创建代理。JDK的动态代理用起来非常简单,当它有一个限制,就是使用动态代理的对象必须实现一个或多个接口。如果想代理没有实现接口的继承的类,我们可以使用CGLib动态代理。 动态代理的选用: 目标对象要求实现接口,使用jdk动态代理。 目标对象不需要实现接口,用CGLib代理。 CGLlb整体架构图 我们发现,cglib在字节码层面的操作技术主

qq_43663493的博客 317

CGLIB 动态代理详解

CGLIB 是一个强大的代码生成库,它可以在运行时动态生成目标类的子类,从而实现对目标类的方法增强,也就是动态代理。与 JDK 动态代理不同,CGLIB 不需要目标类实现接口,它可以直接对类进行代理。这使得 CGLIB 在一些特定场景下具有很大的优势,比如对没有接口的类进行代理或者需要更灵活地控制代理行为时。

dawn191228的博客 2377

CGLib动态代理原理

CGLib动态代理原理 CGLib动态代理是代理类去继承目标类,然后重写其中目标类的方法啊,这样也可以保证代理类拥有目标类的同名方法; 看一下CGLib的基本结构,下图所示,代理类去继承目标类,每次调用代理类的方法都会被方法拦截器拦截,在拦截器中才是调用目标类的该方法的逻辑,结构还是一目了然的; 1.CGLib的基本使用 使用一下CGLib,在JDK动态代理中提供一个Proxy类来创建代理类,而在CGLib动态代理中也提供了一个类似的类Enhancer; 使用的CGLib版本是2.2.2,我是随便找的,不

坚定目标,超越自我 5099

JDK代理与CGLIB代理的区别

特性JDK动态代理CGLIB代理实现机制基于接口实现,使用Proxy和基于继承,使用Enhancer和技术基础Java反射APIASM字节码操作库目标要求必须实现至少一个接口可代理任意普通类(非final)方法限制只能代理接口方法无法代理final方法和private方法性能特点生成速度快,调用速度相对较慢(反射调用)生成速度慢(需要生成字节码),调用速度快(直接方法调用)内存占用较小(复用接口方法)较大(需要生成新的子类)依赖关系JDK原生支持,无需额外依赖。

smilehappiness的博客 1058

彻底搞懂CGLIB代理

CGLIB是一个强大的高性能的代码生成库,它使用运行时字节码操作,可以动态创建类或修改现有类,CGLIB动态代理的主要优点是可以对任何类进行动态代理,不需要实现任何接口

Tan_xiong的博客 1430

CGLIB代理

 使用JDK动态代理存在一定的局限性,使用动态代理的对象必须实现一个或多个接口。如果要对没有实现接口的类进行代理,可以使用CGLIB代理。  CGLIB(Code Generation Library)是一个高性能开源的代码生成包,它采用非常底层的字节码技术,对指定的目标类生成一个子类,并对子类进行增强。  接下来,通过一个案例来演示CGLIB代理的实现过程,具体步骤如下。 创建一个目标类Use...

weixin_36203136的博客 301

CGLIB-多重代理

文章目录前言如何实现CGLIB与JDK动态代理相结合类Spring AOP方式 前言 这里所说的多重代理,是指代理的代理,即Proxy外再包一层Proxy。 由于CGLIB本身的设计,无法实现在Proxy外面再包装一层Proxy(JDK Proxy可以),通常会报如下错误: ...... Caused by: java.lang.ClassFormatError: Duplicate method name&signature in class file target/MyTarget$$Enha

FromZeroJiYuan的博客 1555

基于cglib的接口代理和非接口代理的区别

这是目录jdk动态代理cglib动态代理cglib代理接口cglib代理实现类对比源码版权所有 jdk动态代理 jdk动态代理只可以代理接口,因为最后的实现类要继承Proxy并实现该接口 cglib动态代理 cglib既可代理接口又可以代理实现类,那背后的源码是如何实现的呢? cglib代理接口 接口代码 package com.tqy.document.reader.extention.de...

tqy的博客 7753
上一篇: JDK动态代理
下一篇: 实现自定义starter步骤
Hi@Sunshine
博客等级 码龄9年 49粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值