分享調用Java private方法


上周在修復bug時,發現Java類中某方法是private,且類中沒有用到,第一感覺是方法多余。其實通過分析,發現原來Native Code會通過JNI調到此方法。這也給自己啟發,平時做Code refine時,如果方法沒有被直接調用,一定要注意是否會有反射會調用到等,否則移除后,編譯通過,但會有問題~
 
雖然是小語法點,但很感興趣,而且易被忽略。這兩天查了一些資料,分享下
 
一. Native Code調用Java類中private方法​
例如JNI開發中,C可以反射調到Java的方法,例如通過GetMethodID等API,原因解釋:
所以在判斷private方法在哪里被調用時,記得多在代碼里搜索下,避免出現此類情況,誤認為方法沒有被使用~
 
參考:
 
二. Java中通過反射也可以調用其他類的private方法
舉例:​
其中a是Test類中的private方法,通過getDeclaredMethod可以獲得目標Class中的方法(不包含父類)。能否執行private方法,取決於setAccessible API,此接口會在基類AccessObject中設置成員變量overide為true,注釋的解釋很有用,如下:
如overide為true,會取消Language-Level的安全檢查,如訪問修飾符private的限制等。另外出於安全考慮,非此package無法訪問overide變量。
 
 
 
最后分享個小的tip,Android中反射相關代碼來自ojluni,如果對這個名字感到不解的話,它的意思是: OpenJDK;java.lang;java.util;java.net ;java.io 的縮寫,就是OpenJDK核心庫的意思,與Google采用OpenJDK代替原有Java API的變動有關~Thanks
 
 
                                                                                                                                     - Kevin Song
                                                                                                                                       2017.8.1
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM