JAVA深刻研究——Method的Invoke方法。

詳見:http://www.cnblogs.com/onlywujun/p/3519037.html html


在寫代碼的時候,發現Method能夠調用子類的對象,但子類即便是改寫了的Method,方法名同樣,去調用父類的對象也會報錯,雖然這是很符合多態的現象,也符合java的動態綁定規範,但仍是想弄懂java是如何實現的,就學習了下Method的源代碼。 java

Method的invoke方法緩存

 

1.先檢查 AccessibleObject的override屬性是否爲true。ide

AccessibleObject是Method,Field,Constructor的父類,override屬性默認爲false,可調用setAccessible方法改變,若是設置爲true,則表示能夠忽略訪問權限的限制,直接調用。學習

 

2.若是不是ture,則要進行訪問權限檢測。用Reflection的quickCheckMemberAccess方法先檢查是否是public的,若是不是再用Reflection.getCallerClass(1)方法獲ui

獲得調用這個方法的Class,而後作是否有權限訪問的校驗,校驗以後緩存一次,以便下次若是仍是這個類來調用就不用去作校驗了,直接用上次的結果,(很奇怪用這種方式緩存,由於這種方式若是下次換個類來調用的話,就不用會緩存了,而再驗證一遍,把此次的結果作爲緩存,但上一次的緩存結果就被沖掉了。這是一個很簡單的緩衝機制,只適用於一個類的重複調用)。htm

 

3.調用MethodAccessor的invoke方法。每一個Method對象包含一個root對象,root對象裏持有一個MethodAccessor對象。咱們得到的Method獨享至關於一個root對象的鏡像,全部這類Method共享root裏的MethodAccessor對象,(這個對象由ReflectionFactory方法生成,ReflectionFactory對象在Method類中是static final的由native方法實例化)。對象

ReflectionFactory生成MethodAccessor:若是noInflation的屬性爲true則直接返回MethodAccessorGenerator建立的一個MethodAccessor。blog

不然返回DelegatingMethodAccessorImpl,並將他與一個NativeMethodAccessorImpl互相引用。但DelegatingMethodAccessorImpl執行invoke方法的時候又委託給NativeMethodAccessorImpl了。get

 

再一步深刻

4.NativeMethodAccessorImpl的invkoe方法:

調用natiave方法invoke0執行方法調用.

注意這裏有一個計數器numInvocations,每調用一次方法+1,當比 ReflectionFactory.inflationThreshold(15)大的時候,用MethodAccessorGenerator建立一個MethodAccessor,並把以前的DelegatingMethodAccessorImpl引用替換爲如今新建立的。下一次DelegatingMethodAccessorImpl就不會再交給NativeMethodAccessorImpl執行了,而是交給新生成的java字節碼的MethodAccessor。

MethodAccessorGenerator使用了asm字節碼動態加載技術,暫不深刻研究。

 

總結 一個方法能夠生成多個Method對象,但只有一個root對象,主要用於持有一個MethodAccessor對象,這個對象也能夠認爲一個方法只有一個,至關因而static的。由於Method的invoke是交給MethodAccessor執行的,因此我所想要知道的答案在MethodAccessor的invoke中,深刻MethodAccessor

相關文章
相關標籤/搜索