为了账号安全,请及时绑定邮箱和手机立即绑定

java cglib动态代理

java cglib动态代理

一只萌萌小番薯 2019-05-11 17:35:15
cglib动态代理,为什么a()调用当前类的b(),这个b()是父类的b(),而不是cglib生成的子类的b()呢?@ComponentpublicclassMyTest{publicvoida(){System.out.println("it'sa");b();}publicvoidb(){System.out.println("it'sb");}}@Aspect@Component@Slf4j@GetterpublicclassAspectLog{@Pointcut("execution(public*com.vae1970.demo.aspect.MyTest.*(..))")publicvoidpointcut(){}@Before("pointcut()")publicvoidbefore(JoinPointjp){Methodmethod=(MethodSignature)jp.getSignature().getMethod();System.out.println("log:function"+method.getName());}}@RestControllerpublicclassTestController{@AutowiredprivateMyTestmyTest;@GetMapping("/aspect")publicStringaspect(){myTest.a();return"ok";}}期望输出log:functionait'salog:functionbit'sb实际输出log:functionait'sait'sb我查看了cglib生成的MyTest类,a()和b()都做了代理,那为什么实际执行的时候,没有执行代理类的b()呢?
查看完整描述

2 回答

?
梵蒂冈之花

TA贡献1900条经验 获得超5个赞

因为代理类实际调用的就是原方法。只不过在原方法的前后增加了自定义的方法,生成的代理类而已。在spring中用cglib你可以看org.springframework.aop.framework.CglibAopProxy.DynamicAdvisedInterceptor类里的intercept()方法,最终执行你的a()方法的是下面这句
retVal=methodProxy.invoke(target,argsToUse);
其中这个target参数就是被代理的实体类,即你这里的myTest属性(没被代理的类)
                            
查看完整回答
反对 回复 2019-05-11
  • 2 回答
  • 0 关注
  • 467 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信