spring中,通过cglib实现aop的动态代理时,method.invoke和method.invokeSuper有什么区别,使用上有什么不一样?
时间: 2024-04-20 14:27:00 浏览: 68
在使用 cglib 实现 AOP 动态代理时,method.invoke 和 method.invokeSuper 都是用来调用原始方法的,但是二者有一些不同之处。
具体来说,method.invoke 是直接调用原始方法,而 method.invokeSuper 则是调用被代理类的父类方法,也就是说,如果被代理对象是一个子类,则 method.invokeSuper 会调用父类中的方法,而 method.invoke 则只会调用子类中的方法。
在使用上,method.invoke 和 method.invokeSuper 的区别在于传入的参数不同。method.invoke 需要传入被代理对象和方法的参数,而 method.invokeSuper 则只需要传入被代理对象的实例和方法的参数。
需要注意的是,如果被代理对象是一个接口,则无法使用 cglib 实现动态代理,而只能使用 JDK 自带的动态代理。
相关问题
spring中,通过cglib实现aop的动态代理时,method.invoke和method.invokeSuper有什么区别
在Spring框架中,通过CGLIB实现AOP的动态代理时,method.invoke和method.invokeSuper主要有以下区别:
1. method.invoke:调用代理对象的方法,可以在方法执行前后加入增强逻辑。
2. method.invokeSuper:调用被代理对象的方法,不会触发代理对象的增强逻辑,只有被代理对象的增强逻辑会被执行。
在AOP中,代理对象的方法通常会被增强,而被代理对象的方法不会被增强。因此,在使用CGLIB实现AOP的动态代理时,通常会使用method.invoke方法来调用代理对象的方法,并在方法执行前后加入增强逻辑。而对于被代理对象的方法,可以使用method.invokeSuper方法来调用,以避免重复触发代理对象的增强逻辑。
需要注意的是,在使用method.invokeSuper方法时,必须将当前对象作为第一个参数传递给该方法,以便被代理对象在执行方法时能够正常访问其成员变量和方法。
com.cxm.common.exception.CxmServiceException: 获取日结单数据出错 at com.cxm.service.report.DailyStatManager.reconciliationIndex(DailyStatManager.java:203) at com.cxm.api.report.DailyStatApi.reconciliationIndex(DailyStatApi.java:102) at com.cxm.api.report.DailyStatApi$$FastClassBySpringCGLIB$$4bcc5350.invoke(<generated>) at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:769) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:747) at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:88) at com.cxm.log.CxmLogbackAspect.doAround(CxmLogbackAspect.java:98) at sun.reflect.GeneratedMethodAccessor365.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:644) at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:633) at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:747) at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:95)
这是一个Java异常信息,看起来是在获取日结单数据时出现了错误。具体原因需要查看代码并进行调试,可能是数据访问层或业务逻辑层出现了问题。建议先检查数据源配置是否正确,然后检查SQL查询语句是否正确,最后检查代码逻辑是否正确。如果还无法解决问题,可以考虑使用日志记录工具来查看更详细的错误信息,以便更好地定位和解决问题。
阅读全文