测试新人001 2023-08-20 09:13 采纳率: 66.7%
浏览 13
已结题

ReflectiveMethodInvocation类的第一个代理参数什么情况要加和不加

这个ReflectiveMethodInvocation类的第一个参数proxy代理,是什么情况下需要加呢?
如果加了这个代理再调用proceed方法,是什么效果?目标方法增强?(不加的话我发现就是正常执行环绕通知和目标)

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-08-20 12:31
    关注

    【以下回答由 GPT 生成】

    问题分析:

    在使用ReflectiveMethodInvocation类时,第一个参数proxy为代理对象,这个参数的作用是在目标方法调用前后做一些额外的处理。具体来说,如果加了代理,那么在调用proceed方法时会先执行环绕通知(before advice),然后再执行目标方法,最后再执行环绕通知(after advice)。如果不使用代理,只会执行环绕通知和目标方法的正常执行。

    解决方案:

    第一个参数proxy的作用是为了在调用proceed方法时执行额外的处理,比如执行环绕通知。proxy对象可以在切面中使用。具体的代码可以如下所示:

    import org.aopalliance.intercept.MethodInterceptor;
    import org.aopalliance.intercept.MethodInvocation;
    
    public class MyInterceptor implements MethodInterceptor {
        @Override
        public Object invoke(MethodInvocation invocation) throws Throwable {
            // 执行目标方法之前的处理, 可以理解为是before advice
            System.out.println("Before invoking target method");
    
            // 调用目标方法
            Object result = invocation.proceed();
    
            // 执行目标方法之后的处理, 可以理解为是after advice
            System.out.println("After invoking target method");
    
            return result;
        }
    }
    

    然后在使用ReflectiveMethodInvocation时,可以将proxy参数设置为代理对象,如下所示:

    import org.springframework.aop.framework.ReflectiveMethodInvocation;
    
    public class Main {
        public static void main(String[] args) {
            MethodInvocation methodInvocation = new ReflectiveMethodInvocation(proxy, target, method, args, targetClass, interceptorsAndDynamicMethodMatchers);
            // 执行目标方法及其环绕通知
            Object result = methodInvocation.proceed();
        }
    }
    

    在调用proceed方法时,会先执行MyInterceptor类中的invoke方法中的before advice,然后再执行目标方法,最后再执行MyInterceptor类中的invoke方法中的after advice。

    如果不使用代理,即将proxy参数设置为null,那么在调用proceed方法时只会执行目标方法及其环绕通知,不会执行到MyInterceptor类中的invoke方法中的before advice和after advice。

    综上所述,使用ReflectiveMethodInvocation的第一个参数proxy是为了在调用proceed方法时执行额外的处理。如果加了代理,会在调用proceed方法之前和之后执行相应的处理代码,可以理解为增强目标方法。如果不使用代理,则只会执行目标方法及其环绕通知,不会执行额外的处理代码。

    请注意,以上解决方案是基于Spring框架的AOP相关类的使用,如果问题是关于其他框架或自定义实现的ReflectiveMethodInvocation类,解决方案可能会有所不同。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 9月9日
  • 已采纳回答 9月1日
  • 创建了问题 8月20日

悬赏问题

  • ¥20 stm32标准库红外模块
  • ¥15 在国外文献网站里点击view pdf 加载异常缓慢甚至加载不出来。
  • ¥50 python批量提取发票的信息
  • ¥15 mysql安装,初始化数据库失败
  • ¥15 虚幻五引擎内容如何上传至网盘?
  • ¥15 使用mmpose库时出现了问题
  • ¥15 IRI2016模型matlab运行报错
  • ¥50 bat怎么设置电脑后台自动点击网页指定词运行脚本,输入指定网页链接,指定点击词,指定间隔时间,指定网页出现的词,指定网页出现词出现后后点击锁定,放在后台运行不影响前台鼠标工作
  • ¥20 20CrMnMo的高温变形抗力
  • ¥15 RTX3.6 5565驱动中断报错