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

关于MapperProxy.invoke中if(Object,class.equals(method.getDeclaringClass()))这段代码的意义

这里的判断代码是避免有程序调用接口代理实现对象的Object的方法出现问题.

并不是无用的,而且是必须的.


正在回答

2 回答

嗯,那肯定是必须的,不做这个判断如果进来的是个接口,又没有实现类,这个接口方法是不能被反射调用的,如果是Object里的方法,它就帮你调用了。

6 回复 有任何疑惑可以回复我~

我来说正确答案吧。我们知道这个MapperProxy就是一个InvocationHandler(他的作用是jdk创建动态代理时用的,不清楚动态代理,自己补习一下),也就是我们会根据当前的接口创建一个这个接口的动态代理对象,使用动态代理对象再利用反射调用实际对象的目标方法。

然而动态代理对象里面的方法都是Interface规定的。但是动态代理对象也能调用比如toString(),hashCode()等这些方法呀,这些方法是所有类从Object继承过来的。

所以这个判断的根本作用就是,如果利用动态代理对象调用的是toString,hashCode,getClass等这些从Object类继承过来的方法,就直接反射调用。如果调用的是接口规定的方法。我们就用MapperMethod来执行。


结论:

1)、method.getDeclaringClass用来判断当前这个方法是哪个类的方法。

2)、接口创建出的代理对象不仅有实现接口的方法,也有从Object继承过来的方法

3)、实现的接口的方法method.getDeclaringClass是接口类型,比如com.atguigu.dao.EmpDao

        从Object类继承过来的方法类型是java.lang.Object类型

4)、如果是Object类继承来的方法,直接反射调用

        如果是实现的接口规定的方法,利用Mybatis的MapperMethod调用

17 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

关于MapperProxy.invoke中if(Object,class.equals(method.getDeclaringClass()))这段代码的意义

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信