課程
/后端開發
/Java
/通過自動回復機器人學Mybatis---加強版
這里的判斷代碼是避免有程序調用接口代理實現對象的Object的方法出現問題.
并不是無用的,而且是必須的.
2015-01-26
源自:通過自動回復機器人學Mybatis---加強版 2-4
正在回答
嗯,那肯定是必須的,不做這個判斷如果進來的是個接口,又沒有實現類,這個接口方法是不能被反射調用的,如果是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 的奧秘,一起揭開 Mybatis 面紗
1 回答關于源碼
1 回答關于編碼格式
7 回答java.lang.Error: 無法解析的編譯問題: 類型 MetaObject 中的方法 forObject(Object, ObjectFactory, ObjectWrapperFactory, ReflectorFactory)對于參數(StatementHandler, ObjectFactory, ObjectWrapperFactory)不適用
2 回答關于MetaObject
3 回答老師的源碼中沒有調用page.count這個方法呢?
Copyright ? 2025 imooc.com All Rights Reserved | 京ICP備12003892號-11 京公網安備11010802030151號
購課補貼聯系客服咨詢優惠詳情
慕課網APP您的移動學習伙伴
掃描二維碼關注慕課網微信公眾號
2015-01-27
嗯,那肯定是必須的,不做這個判斷如果進來的是個接口,又沒有實現類,這個接口方法是不能被反射調用的,如果是Object里的方法,它就幫你調用了。
2017-01-05
我來說正確答案吧。我們知道這個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調用