关于return的问题

关于return的问题

以下代码的return子句到底返回什么东西?无论是校验还是不校验,之后不都是执行method.invoke(userDao,args)方法,相当于执行save()、delete()等就可以吗?请老师详细解释一下,谢谢!

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
   if ("save".equals(method.getName())){
       System.out.println("权限校验");
       return method.invoke(userDao,args);
   }
   return method.invoke(userDao,args);
}方法吗?

正在回答

登陆购买课程后可参与讨论,去登陆

3回答

同学你好!

  1. 首先无乱if语句是否执行,都会调用return method.invoke(userDao,args);来执行以及返回

  2. 之所以写if的原因是为了在执行save方法之前进行校验。这里的:

       System.out.println("权限校验");语句相当于是执行一次权限校验。

    综上所述:如果不是save方法,直接执行,如果是save方法,对权限进行校验之后再执行

  3. 这个案例中,在if中也可以不写return method.invoke(userDao,args);直接写在if外面也可以,它们的最终效果是一样的,比如:

 if ("save".equals(method.getName())){
        System.out.println("权限校验");
       
    }
    return method.invoke(userDao,args);
}

如果我的回答解决了你的疑惑,请采纳,祝学习愉快~

好帮手慕阿满 2020-01-04 18:17:05

同学你好,method.invoke(userDao,args) 的作用是调用被增强的类的原本对应的方法,而return是返回则是将其返回。这里的save(),delete()方法都是没有返回值的,所以调用method.invoke()后return null也可以正常运行。如:

http://img1.sycdn.imooc.com//climg/5e10649e0916530b08550606.jpg

但是有些方法是有返回值的,如果这里没有mothod.invoke()的结果返回,那么将会得到一个null值,如:

save()方法改为有返回值的方法,如:

http://img1.sycdn.imooc.com//climg/5e10654209cae05a06060187.jpg

代理类中没有返回method.invoke();,如:

http://img1.sycdn.imooc.com//climg/5e10656e09d04b0e06690290.jpg

运行结果:

http://img1.sycdn.imooc.com//climg/5e10658a09ff11d809100657.jpg

代理类修改为return method.invoke(),

http://img1.sycdn.imooc.com//climg/5e1065e5097b0b9807950284.jpg

再次运行,如:

http://img1.sycdn.imooc.com//climg/5e1065fc097cbdf408820561.jpg

所以这里的return是返回增强后的结果。

祝:学习愉快~

  • 提问者 慕沐8221787 #1
    那直接在if语句外用return不就可以吗,为什么if内外都要用呢?如下: public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if ("save".equals(method.getName())){ System.out.println("权限校验"); return method.invoke(userDao,args); } return method.invoke(userDao,args); }
    2020-01-04 20:24:39
好帮手慕阿满 2020-01-04 13:49:50

同学你好,return method.invoke(userDao,args) 的作用是调用被增强的类的原本对应的方法,无论是save()方法,delete()方法等最后都会调用原来对应的方法。

关于判断,以此次案例举例,if("save".equlals(method.getName()))判断是否是save方法,如果是save方法,则会在调用增强类原本对应的方法前进行权限校验。

如果我的回答解决了你的疑惑,请采纳。祝:学习愉快~

  • 提问者 慕沐8221787 #1
    基本是答非所问!我的问题是为什么要用return返回,直接执行method.invoke(userDao,args) 代码,不就是执行了对应方法吗?请重点解释这里为什么要用到返回,返回的内容又是什么?
    2020-01-04 14:39:32
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
SSM主流框架入门与综合项目实战2018版
  • 参与学习           人
  • 提交作业       205    份
  • 解答问题       4317    个

Java中非常实用的SSM整合开发内容,从Spring开始,到MyBaits的进阶内容,再到SpringMVC的应用,最后是SSM整合开发案例,逐步深入,助你成长为一名Java工程师!

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师