问答详情
源自:2-4 接口式编程原理(下)

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

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

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


提问者:朱宏青 2015-01-26 12:34

个回答

  • 源生活
    2015-01-27 18:22:44

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

  • ForSum
    2017-01-05 11:04:06

    我来说正确答案吧。我们知道这个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调用