上週在修復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