前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >分享调用Java private方法

分享调用Java private方法

作者头像
宋凯伦
发布2018-01-04 15:14:32
1.4K0
发布2018-01-04 15:14:32
举报
文章被收录于专栏:宋凯伦的技术小栈

上周在修复bug时,发现Java类中某方法是private,且类中没有用到,第一感觉是方法多余。其实通过分析,发现原来Native Code会通过JNI调到此方法。这也给自己启发,平时做Code refine时,如果方法没有被直接调用,一定要注意是否会有反射会调用到等,否则移除后,编译通过,但会有问题~

虽然是小语法点,但很感兴趣,而且易被忽略。这两天查了一些资料,分享下

一. Native Code调用Java类中private方法​

例如JNI开发中,C可以反射调到Java的方法,例如通过GetMethodID等API,原因解释:

所以在判断private方法在哪里被调用时,记得多在代码里搜索下,避免出现此类情况,误认为方法没有被使用~

参考:

1. https://stackoverflow.com/questions/12208387/can-a-native-method-call-a-private-method

2. http://journals.ecs.soton.ac.uk/java/tutorial/native1.1/implementing/method.html

二. Java中通过反射也可以调用其他类的private方法

举例:​

其中a是Test类中的private方法,通过getDeclaredMethod可以获得目标Class中的方法(不包含父类)。能否执行private方法,取决于setAccessible API,此接口会在基类AccessObject中设置成员变量overide为true,注释的解释很有用,如下:

如overide为true,会取消Language-Level的安全检查,如访问修饰符private的限制等。另外出于安全考虑,非此package无法访问overide变量。

参考:https://stackoverflow.com/questions/880365/any-way-to-invoke-a-private-method

最后分享个小的tip,Android中反射相关代码来自ojluni,如果对这个名字感到不解的话,它的意思是: OpenJDK;java.lang;java.util;java.net ;java.io 的缩写,就是OpenJDK核心库的意思,与Google采用OpenJDK代替原有Java API的变动有关~Thanks

                                                                                                                                     - Kevin Song

                                                                                                                                       2017.8.1

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-08-01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档