首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何使用CGLIB中的ByteBuddy和MethodInterceptor截获方法调用MethodProxy.invokeSuper(...)

CGLIB是一个基于Java字节码操作库的高性能代码生成库,它可以在运行时扩展和增强Java类。ByteBuddy是CGLIB的一个替代方案,它提供了更简单、更灵活的API来修改和创建Java类。

要使用CGLIB中的ByteBuddy和MethodInterceptor来截获方法调用,可以按以下步骤进行:

  1. 导入CGLIB和ByteBuddy的相关依赖。
  2. 创建一个实现了MethodInterceptor接口的类,该类将作为截获方法调用的处理器。MethodInterceptor接口定义了一个方法intercept,可以在该方法中编写自定义的逻辑来处理截获的方法调用。
  3. 使用ByteBuddy来创建一个代理类。通过调用ByteBuddy的静态方法subclass创建一个子类,使用方法传递原始类作为参数。然后,使用MethodDelegation类的静态方法to创建一个代理类的实例,并传递实现了MethodInterceptor接口的处理器类对象。
  4. 使用代理类的实例调用方法。代理类会截获所有调用,并将它们传递给MethodInterceptor接口的实现类。

下面是一个示例代码:

代码语言:txt
复制
import net.bytebuddy.ByteBuddy;
import net.bytebuddy.implementation.MethodDelegation;
import net.bytebuddy.implementation.bind.annotation.BindingPriority;
import net.bytebuddy.implementation.bind.annotation.Morph;
import net.bytebuddy.implementation.bind.annotation.RuntimeType;
import net.bytebuddy.implementation.bind.annotation.SuperMethod;
import net.bytebuddy.implementation.bind.annotation.This;
import net.bytebuddy.matcher.ElementMatchers;
import net.bytebuddy.utility.JavaModule;

import java.lang.reflect.Method;

public class MethodInterceptorExample {
    public static void main(String[] args) {
        // 创建一个实现MethodInterceptor接口的处理器
        MethodInterceptor methodInterceptor = 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;
            }
        };

        // 使用ByteBuddy创建代理类
        Class<?> dynamicType = new ByteBuddy()
                .subclass(Object.class)
                .method(ElementMatchers.any())
                .intercept(MethodDelegation.to(methodInterceptor))
                .make()
                .load(MethodInterceptorExample.class.getClassLoader(), JavaModule.NONE)
                .getLoaded();

        try {
            // 使用代理类的实例调用方法
            Object proxyInstance = dynamicType.newInstance();
            proxyInstance.toString();
        } catch (InstantiationException | IllegalAccessException e) {
            e.printStackTrace();
        }
    }
}

在这个例子中,我们使用ByteBuddy创建了一个代理类,代理类截获了toString方法的调用,并在调用前后打印相关信息。

请注意,以上示例中的代码只是展示了如何使用CGLIB中的ByteBuddy和MethodInterceptor截获方法调用,实际应用中需要根据具体需求和业务逻辑进行相应的修改和扩展。

对于腾讯云的相关产品和推荐链接,由于要求不能提及具体的云计算品牌商,建议参考腾讯云官方文档或咨询腾讯云技术支持来获取相关信息。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Java动态代理之一CGLIB详解

("调用方法" + methodName +"之【后】日志处理"); } } 实现MethodInterceptor接口intercept方法。...在方法内部主要调用methodProxy.invokeSuper,执行原始类方法。如果调用invoke方法否会出现死循环。...UserDao,拦截器调用intercept()方法,intercept()方法由自定义LogInterceptor实现,所以最后调用LogInterceptorintercept()方法,从而完成了由代理对象访问到目标对象动态代理实现...JDK Proxy优势: 最小化依赖关系、代码实现简单、简化开发维护、JDK原生支持,比CGLIB更加可靠,随JDK版本平滑升级。而字节码类库通常需要进行更新以保证在新版Java上能够使用。...小结 关于动态代理相关实现就讲这么多,在具体业务场景如何选择可根据它们优缺点进行针对性比对。不过作为Java领域标杆项目Spring,很多功能都选择使用CGLIB来实现。

1.9K21

强悍Spring之AOP CGLIB实现

其被广泛应用于AOP框架(Spring、dynaop),用以提供方法拦截操作。Hibernate作为一个比较受欢迎ORM框架,同样使用CGLIB来代理单端(多对一一对一)关联。... 通过CGLIB代理实现如下: 首先实现一个MethodInterceptor方法调用会被转发到该类intercept()方法。...我们通过CGLIBEnhancer来指定要代理目标对象、实际处理代理逻辑对象,最终通过调用create()方法得到代理对象,对这个对象所有非final方法调用都会转发给MethodInterceptor.intercept...()方法,在intercept()方法里我们可以加入任何逻辑,比如修改方法参数,加入日志功能、安全检查功能等;通过调用MethodProxy.invokeSuper()方法,我们将调用转发给原始对象,具体到本例...CGLIGMethodInterceptor作用跟JDK动态代理代理InvocationHandler很类似,都是方法调用中转站。

51440
  • CGLib浅析

    这里调用代理类方法实际上是重写父类拦截。重写方法中会去调用intercept方法; 调用intercept,方法中会对调用代理方法invokeSuper方法。...可是问题又来了,拦截器是我们自己来实现并添加业务自定义逻辑,当我们想要在拦截器里调用到原始被代理对象insert方法,该如何去实现呢?...; CGLib动态代理则使用继承机制,被代理类代理类是继承关系,直接调用其中方法; 在其中FastClass类发挥了什么作用呢?...所以我称为 FastClass辅助类 在JDK动态代理调用目标对象方法使用是反射,而在CGLIB动态代理中使用是FastClass机制。...FastClass使用:动态生成一个继承FastClass类,并向类写入委托对象,直接调用委托对象方法

    51820

    Spring系列第十六讲 SpringJava动态代理技术(下)

    CGLIB底层使用了ASM(一个短小精悍字节码操作框架)来操作字节码生成新类。除了CGLIB库外,脚本语言(如GroovyBeanShell)也使用ASM生成字节码。...spring已将第三方cglib jar包中所有的类集成到spring自己jar包,本系列内容都是spring相关,为了方便,我们直接使用spring内部已集成来讲解 5个案例来演示cglib...接口, 此处我们使用是org.springframework.cglib.proxy.MethodInterceptor,也是一个接口,实现了Callback接口, 当调用代理对象任何方法时候...还有一个重点是Object result = methodProxy.invokeSuper(o, objects);可以调用被代理类,也就是Service1类具体方法,从方法名称意思可以看出是调用父类...C3依赖于C1,都是通过构造器注入C1,注意代码@1@2都是调用c1方法获取容器C1,如何确保多次获取C1都是一个

    1.4K40

    cglib动态代理实现原理_jdk cglib 动态代理 区别

    我们先看一下cglib如何创建一个代理类,从我们代码调用net.sf.cglib.proxy.Enhancer#create()方法开始一层层往下看 // net.sf.cglib.proxy.Enhancer...代理类是如何调用父类方法 从生成代理类代码我们可以看到,我们最终调用代理对象方法时,实际上都是执行编码时创建net.sf.cglib.proxy.MethodInterceptor接口对象...我们在编码时候使用methodProxy.invokeSuper()方法,我们接下来看下invokeSuper方法如何调用父类方法。...MethodProxy.invokeSuper()方法可以不创建任何对象调用原始类方法之外,还可以通过MethodProxy.invoke()传入原始方法Method.invoke()来调用原始方法...使用MethodProxy.invokeSuper()方法,该方法会将原始方法执行重新托管给代理类,所以即使是内部调用,内部方法切面增强代码依然生效 使用MethodProxy.invoke()方法

    99120

    Java动态代理两种实现方法

    AOP源码中用到了两种动态代理来实现拦截切入功能:jdk动态代理cglib动态代理。两种方法同时存在,各有优劣。...动态代理实现 Cglib是一个优秀动态代理框架,它底层使用ASM在内存动态生成被代理类子类,使用CGLIB即使代理类没有实现任何接口也可以实现动态代理功能。...类代理类,可以方便实现对源对象方法调用,如使用:     Object o = methodProxy.invokeSuper(proxy, args);//虽然第一个参数是被代理对象,也不会出现死循环问题...net.sf.cglib.proxy.MethodInterceptor接口是最通用回调(callback)类型,它经常被基于代理AOP用来实现拦截(intercept)方法调用。...原来方法可能通过使用java.lang.reflect.Method对象一般反射调用,或者使用 net.sf.cglib.proxy.MethodProxy对象调用

    40510

    Spring AOP动态代理两种实现方式及其过程_spring动态代理原理

    使用代理对象, 是为了在不修改目标对象基础上, 增强目标对象业务逻辑. 静态代理 静态代理特点是, 为每一个业务增强都提供一个代理类, 由代理类来创建代理对象....调用dao层,完成转账主业务. CGLIB动态代理 JDK动态代理必须要有接口, 但如果要代理一个没有接口类该怎么办呢? 这时我们可以使用CGLIB动态代理....CGLIB动态代理原理是生成目标类子类, 这个子类对象就是代理对象, 代理对象是被增强过. 注意: 不管有没有接口都可以使用CGLIB动态代理, 而不是只有在无接口情况下才能使用....dao层,完成转账主业务."); } } (2) 切面抽象类 定义一个切面抽象类, 该类使用了模板方法设计模式, 为开始, 结束, 异常, 前置增强, 后置增强提供了默认实现, 当我们定义切面类时只需要按需重写它们就行...Throwable e) { } /** * 最终增强 */ public void end() { } } (3) 切面类 创建一个切面类, 类配置切入点增强

    66340

    【说站】javaCglib代理使用

    javaCglib代理使用 说明 1、Cglib代理可以称为子类代理,是在内存构建子类对象,从而扩展目标对象功能。 静态代理JDK代理都需要一个对象来实现一个接口。...有时候代理对象只是一个单独对象,Cglib代理可以在这个时候使用。 2、Cglib通过Enhancer生成代理类,通过实现MethodInterceptor接口,实现intercept方法。...可以在该方法添加增强方法,并可以使用反射Method或MethodProxy继承类来调用原始方法。... Throwable {         System.out.println("TVProxyFactory enhancement.....");         Object object = methodProxy.invokeSuper...(o, objects);         return object;     } } 以上就是javaCglib代理使用,希望对大家有所帮助。

    26020

    动态代理大揭秘,带你彻底弄清楚动态代理!

    268224-20210914111949875-1990767376.png 其实代理模式核心思想就是这么简单,在java,代理又分静态代理动态代理2种,其中动态代理根据不同实现又区分基于接口动态代理基于子类动态代理...从而会调用intercept方法。而在intercept方法里,进行了附加功能执行,最后还是调用了原始bean相应方法。...相对于bcel, asm等这些工具,开发者不需要了解虚拟机指令,就能动态改变类结构,或者动态生成类。 在日常使用,javassit通常被用来动态修改字节码。它也能用来实现动态代理功能。...可以看到,javassist也是用”凭空“生成子类方式类来解决,代码最后也是调用了原始bean目标方法完成代理。...ByteBuddy也是一个大名鼎鼎开源库,Cglib一样,也是基于ASM实现。

    41320

    CGLIB动态代理

    [JDK动态代理][1]必须提供接口才可以使用,但是在某些环境下,接口这个条件是无法满足,这时候[JDK动态代理][1]就无法使用了,只能采取第三方技术,比如CGLIB动态代理技术。...第二步:动态代理绑定代理逻辑实现 这里将获取代理对象对真实服务类进行代理逻辑代码集中在一个类,实现代理逻辑类需要实现MethodInterceptor接口中intercept方法。..."); System.out.println("代理方法调用真实对象之前逻辑处理"); Object obj = methodProxy.invokeSuper(proxy..., args); System.out.println("代理方法调用真实对象之后逻辑处理"); return obj; } } 这里用了CGLIB加强者Enhancer...: 进入代理方法 代理方法调用真实对象之前逻辑处理 向CGLIB问好...

    48110

    cglib实现动态代理_cglibjdk动态代理

    一、前言   说到动态代理,开发者们第一时间想到就是JDK动态代理cglib动态代理。了解Spring同学应该知道,Spring AOP功能底层实现,就是使用这两种动态代理。...三、主要组件 MethodInterceptor方法拦截器 在调用目标方法时,cglib会回调MethodInterceptor接口方法,来实现你自己代理逻辑,类似于JDKInvocationHandler...Enhancer:字节码增强器 用来关联目标类代理处理逻辑类,并创建代理实例。 四、示例 需求:在进入方法前开启事务,方法调用结束后关闭事务。...创建代理实例 return eh.create(); } } 一般把获取代理实例方法,也放在自定义MethodInterceptor。...使用代理实例调用目标方法 userServiceProxy.getUserName(6L); } 这样便达到了代理效果,开启、关闭事务代码模块化到自定义MethodInterceptor

    31121

    Spring基础(九):代理模式介绍

    然而在实际开发我们是可能是有非常多类是需要被代理,并且事先我们可能并不知道我们要代理哪个类。所以如果继续使用静态代理反而会增加许多工作量,并且效率低下,代码复用率也不好。...这种情况下,代理类并不是在Java代码定义好,而是在程序运行时根据我们在Java代码“指示”动态生成Proxy动态代理 JDK动态代理 面向接口cglib动态代理..., 方法调用时传入实参数组 MethodProxy methodProxy 子类重写父类方法 personProxy >>> eat()...不增强运行 res=methodProxy.invokeSuper(o,objects); // 子类对象方法在执行,默认会调用父类对应被重写方法...,实现类其他接口无关方法是无法增强代理对象只能读取到接口中方法注解,不能读取到实现类方法注解3、 Cglib 动态代理面向父类接口没有直接关系,可以增强父类定义方法还可以增加一个类其他方法

    30841

    Spring高手之路17——动态代理艺术与实践

    下面是JDK动态代理核心要点如何使用它们概述。使用步骤定义接口:首先定义一个或多个接口,代理对象将实现这些接口。实现接口:创建一个类,它实现上述接口,提供具体实现逻辑。...这个例子展示了JDK动态代理在实际应用如何进行方法级别的细粒度控制,同时保持代码灵活性可维护性。通过动态代理,我们可以在不修改原始类代码情况下,为对象动态地添加额外行为。...在CGLIB代理使用MethodProxy.invokeSuper而不是MethodProxy.invoke来调用被代理方法,以避免无限循环。...()); return result; } }}运行结果  在这个改写,我们使用CGLIBEnhancerMethodInterceptor来代替了JDK...在JDK动态代理,这通常通过反射实现;而在CGLIB,可以通过MethodProxy.invokeSuper方法调用

    41120

    动态代理(一)

    代理模式是Java一种设计模式,开发可能会有一种场景,某个类方法需要补充,但是由于不想在原有的类基础上改动,该如何做呢,如下: 接口: public interface ProxyUserService...ProxyUserService子类初始化,在创建ProxyUserServiceStaticImpl对象时,构造方法传入ProxyUserServiceImpl实例即可,它getUserMobile...Object[] args) throws Throwable { //执行前预处理 Object result = method.invoke(target,args);//调用被代理类方法...,在调用被代理类方法前后可以实现需要逻辑. cglib动态代理 public class ProxyUserServiceCgLib implements MethodInterceptor{...总结 jdk代理目标对象必须实现接口 cglib代理目标对象可以不实现接口 如果目标对象没有实现接口,使用cglib

    36030

    不一样视角来学习Spring源码之AOP---

    不一样视角来学习Spring源码之AOP--- cglib 代理进阶 模拟 cglib 代理 收获 cglib 避免反射调用 收获 ---- 系列文章: 不一样视角来学习Spring源码之容器与Bean...,再来看下,下面我们通过一张图给大家回顾一下两者相似之处区别: JDK动态代理使用InvocationHandler作为拦截器,拦截所有代理方法执行,从而可以通过InvocationHandler...,必须调用到足够次数才会进行优化 methodProxy.invoke 是不反射调用,它会正常(间接)调用目标对象方法(Spring 采用) methodProxy.invokeSuper 也是不反射调用...=ALL-UNNAMED ---- cglib 避免反射调用 上面讲到了,通过MethodProxy,cglib可以避免通过反射调用目标对象里面的方法,那么具体是如何做到呢?...invokeinvokesuper方法调用可以避免对方法反射调用,那么如何实现呢?

    18720

    016 Java动态代理

    jdkcglib两种解决方案。 要生产一个类A代理类,唯一需要了解就是生成一个什么类,因此就有了基于该类接口构造一个“A”。...而最好做法是直接操作字节码文件,jdkcglib生成字节码文件分别用了sunProxyGenerator开源项目ASM字节码框架。 ?...JDK动态代理实现 jdk动态代理,依赖是反射包下InvocationHandler接口,我们代理类实现InvocationHandler,重写invoke()方法,每当我们代理类调用方法时...cglib动态代理实现 cglib需要jar包:cglib.jar asm.jar cglib依赖cglib包下MethodInterceptor接口,每调用代理类方法,都会调用intercept...方法 CglibMethodInterceptor.java import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy

    727100

    手动实现一个迷你版AOP(实战增强版)

    上边代码TargetInterceptorintercept方法会在目标函数被调用之后自动进行回调操作,从而实现代理调用效果。...cglib实现代理基本思路 1.对被调用对象进行一层包装,并且对方法建立索引。 2.当调用目标方法时候,通过索引值去寻找并调用函数。...代码地址见文末 难点: 如何方法建立索引?如何根据索引调用函数? 这里贴出我自己一些思考输出。 对调用方法名称取出hashcode,然后通过switch关键字判断需要调用对函数名称: ?...使用起来差不多,不过很多细节方面没有做得特别完善: ? 使用cglib实现代理功能,主要目的就是希望在执行某些函数之前去调用某些方法。为了实现这种方式,其实借助反射也是可以达成目的。...但是反射在多次调用时候性能开销比较大。cglib在这块所做优化主要是对调用方法做了一次索引包装,生产新字节码,实现性能上提升。 相关实现对代码仓库地址可以见文末。

    41820
    领券