在MapperProxy类中的isDefaultMethod方法的作用?
因为JDK1.8的新特性 接口中可以定义默认方法,是为了解耦,因为过去接口的方法器实现了都需要重写,对于接口的修改就变得复杂和难,所以引入了default默认实现方法,也就是说只需要在接口中定义了default修饰的方法,其子类不需要去重写也可以使用。
interface InterfaceA {
default void foo() {
System.out.println("InterfaceA foo");
}
}
而MyBatis中的isDefaultMethod()方法就是用来过滤Mapper接口中的default方法的,应为MyBatis这个框架只是为了动态代理Mapper接口从而获取到对于需要执行的sql语句,而MapperProxy这个代理触发类的invoke方法中只是为了拿到sql语句(至于原理,可以去学习一下MyBatis的源码),而并不会真正的执行方法。但是如果用户执行的是接口中的default方法的话,MyBatis就需要为用户提供正常的代理流程。
MapperProxy类的invoke方法
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
try {
if (Object.class.equals(method.getDeclaringClass())) {
return method.invoke(this, args);