关于Mybatis源码中MapperProxy中动态代理的问题,不理解这段代码是做什么的

北风刮的不认真了 发布于 2016/08/26 17:59
阅读 613
收藏 0
//看下面的注释~~~
  public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    //动态代理的是接口,method也就是接口中的方法喽,怎么会跟Object.class
    //相等,求大神帮忙解析下这段代码的使用场景/目的
    //在高版本中 == 变成了 equals方法了。//不理解的代码开始
    if (method.getDeclaringClass() == Object.class) {
      return method.invoke(this, args);
    }//不理解的代码结束
    final Class<?> declaringInterface = findDeclaringInterface(proxy, method);
    final MapperMethod mapperMethod = new MapperMethod(declaringInterface, method, sqlSession);
    final Object result = mapperMethod.execute(args);
    if (result == null && method.getReturnType().isPrimitive() && !method.getReturnType().equals(Void.TYPE)) {
      throw new BindingException("Mapper method '" + method.getName() + "' (" + method.getDeclaringClass() + ") attempted to return null from a method with a primitive return type (" + method.getReturnType() + ").");
    }
    return result;
  }



加载中
0
_DeepBlue
_DeepBlue

因为在java中所有的对象都是继承Object的

if (method.getDeclaringClass() == Object.class) {
      return method.invoke(this, args);
    }



上面那几行代码是为了实现从Object继承的方法(toStirng,equals,hashCode等)

如果去掉那几行,调用Mapper中的toStirng,equals,hashCode等方法的时候都会返回null

返回顶部
顶部