分享调用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
相关文章
相关标签/搜索