分享调用Java private方法

上周在修复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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏杂烩

duubo分组聚合 原

除了官网上有这部分的简单介绍外,在别的地方几乎找到真正可行的测试了,这里自己捣鼓一下,已做备忘。

611
来自专栏Java学习网

java开发中代码级别的优化方法总结,有效提高程序性能

负载测试和应用程序监控对于确定应用程序的一些关键性能瓶颈非常有用。但同时,我们需要遵循良好的编码习惯,以避免在对应用程序进行监控的时候出现过多的性能问题。

762
来自专栏代码GG之家

android MVVM开发模式(五)

android MVVM开发模式(五) 上一讲我们说了@InverseBindingAdapter标记的事情。通过这个,我们可以实现view向数据方向的传递。从...

1986
来自专栏极客编程

测试利器Mocha

mocha 是一个功能丰富的javascript测试框架,可以运行在nodejs和浏览器环境,使异步测试变得简单有趣。mocha 串联运行测试,允许灵活和精确地...

842
来自专栏猿人谷

C++内存管理学习堆和栈

一 C++内存管理 1.内存分配方式   在讲解内存分配之前,首先,要了解程序在内存中都有什么区域,然后再详细分析各种分配方式。 1.1 C语言和C++内存分...

2646
来自专栏技术博文

js中判断浏览器版本

var ai = { ovb: { /** * 该对象用于判断系统,系统版本,浏览器,...

3745
来自专栏前端杂货铺

深入node之Transform

Transform流特性 在开发中直接接触Transform流的情况不是很多,往往是使用相对成熟的模块或者封装的API来完成流的处理,最为特殊的莫过于throu...

3045
来自专栏技术栈大杂烩

Python: 受限制的 "函数调用"

函数功能简单明了, 对于结果, 大家应该也不会有太大的异议:func分别是取得全局命名空间中a的值和使用内置命名空间中的函数id获取了a的地址. 熟悉Pytho...

1323
来自专栏游戏开发那些事

【游戏开发】小白学Lua(上)

  在很多游戏中,脚本语言是不可或缺的一部分,很多游戏都使用到了Lua,js,python一类的脚本,脚本语言可以在很多方面给开发进程带来帮助。脚本语言可以作为...

1042
来自专栏java一日一条

8种常见的Java不规范代码

在工作上,我最近对一个现有的Java项目代码进行了清理。完成之后,我发现了一些反复出现的不规范代码。所以,我把它们整理成了一个列表出来分享给我的同行希望能引起注...

963

扫码关注云+社区