朱宏青
2015-01-26 12:34
这里的判断代码是避免有程序调用接口代理实现对象的Object的方法出现问题.
并不是无用的,而且是必须的.
嗯,那肯定是必须的,不做这个判断如果进来的是个接口,又没有实现类,这个接口方法是不能被反射调用的,如果是Object里的方法,它就帮你调用了。
我来说正确答案吧。我们知道这个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调用
通过自动回复机器人学Mybatis---加强版
53664 学习 · 112 问题
相似问题