亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

關于MapperProxy.invoke中if(Object,class.equals(method.getDeclaringClass()))這段代碼的意義

這里的判斷代碼是避免有程序調用接口代理實現對象的Object的方法出現問題.

并不是無用的,而且是必須的.


正在回答

2 回答

嗯,那肯定是必須的,不做這個判斷如果進來的是個接口,又沒有實現類,這個接口方法是不能被反射調用的,如果是Object里的方法,它就幫你調用了。

6 回復 有任何疑惑可以回復我~

我來說正確答案吧。我們知道這個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調用

17 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消

關于MapperProxy.invoke中if(Object,class.equals(method.getDeclaringClass()))這段代碼的意義

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號