Java反射包下的Method類中的Invoke方法
Method的invoke方法
1 先校驗AccessibleObject的override字段
指示此對象是否覆蓋語言級別的訪問檢查。初始化為“ false”
字段,方法和構造方法都會使用此字段
注意:為了安全起見,此字段在此反射包外部均不可見。
AccessibleObject是Method,Field,Constructor的父類
可調用
setAccessible
方法改變,如果設置為true,則表示可以忽略訪問權限的限制,直接調用。
便利方法來設置accessible標志對象的數組具有單個安全檢查(效率)。
首先,如果有安全管理器,它checkPermission方法被稱為一個ReflectPermission(“suppressAccessChecks”)的許可。
甲SecurityException如果升高flag是true ,但任何輸入的元件中的可訪問性array可以不改變(例如,如果元素對象是Constructor對象的類Class )。 在這樣一個SecurityException的情況下,對象的可訪問性被設置為flag數組元素高達(但不包括),用于其中發生異常的元件; 元件以外(并包括)該元素的對發生異常的可接近不變。
2 false,訪問權限校驗
Reflection.quickCheckMemberAccess方法先檢查是不是public的
如果不是再用Reflection.getCallerClass(1)方法獲得到調用這個方法的Class,然后做是否有權限訪問的校驗,校驗之后緩存一次,以便下次如果還是這個類來調用就不用去做校驗了,直接用上次的結果
3 調用MethodAccessor的invoke方法
每個Method對象包含一個root對象
用于共享MethodAccessors
此分支結構//僅當前只有兩個級別深度(即一個根Method和可能指向它的許多Method對象)
如果此分支結構曾經包含循環,則可能會發生死鎖
root對象里持有一個MethodAccessor對象
設置此Method對象的MethodAccessor和(遞歸)其根
獲得的Method對象相當于一個root的鏡像,所有這些Method對象共享root里的MethodAccessor對象(這個對象由ReflectionFactory方法生成,ReflectionFactory對象在Method類中是static final的由native方法實例化)。
ReflectionFactory生成MethodAccessor
如果noInflation的屬性為true則直接返回MethodAccessorGenerator創建的一個MethodAccessor
否則返回DelegatingMethodAccessorImpl,并將他與一個NativeMethodAccessorImpl互相引用
但DelegatingMethodAccessorImpl執行invoke方法的時候又委托給NativeMethodAccessorImpl了
DelegatingMethodAccessorImpl
DelegatingMethodAccessorImpl 類對象就是一個代理對象,主要負責調用被代理對象 delegate 的 invoke() 方法
var1 就是控制器類
var2 就是 req 和 resp
參考
https://www.cnblogs.com/onlywujun/p/3519037.html
https://binshao.site/2019/04/03/Reflection/
Java
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。