分享调用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 条评论
登录 后参与评论

相关文章

来自专栏Android干货

Python异常处理机制、调试、测试

try执行一段可能会发送异常的代码,如果有异常情况发送 走except , 如果没有则不走,最后不管代码有没有发送异常,都会执行finally里的代码

803
来自专栏大内老A

让IoC动态解析自定义配置(提供基于Unity的实现)

在《通过自定义配置实现插件式设计》中,通过在运行时对配置的动态解析实现了真正的“插件式”设计,其本质就是让配置自行提供对配置类型实例的创建。在这篇文章中,我们将...

3248
来自专栏Linux驱动

34.Linux-printk分析、使用printk调试驱动

本节学习目的 1)分析printk()函数 2)使用printk()调试驱动 1.在驱动调试中,使用printk(),是最简单,最方便的办法 当uboot的命令...

2555
来自专栏还债之路

Linux-四剑客-find-awk-grep-sed解释----未完结版

find - search for files in a directory hierarchy 搜索目录层次结构中的文件 用来在指定目录下面查找文件或目录,任...

723
来自专栏程序员互动联盟

android apk 防止反编译技术第二篇-运行时修改字节码

上一篇我们讲了apk防止反编译技术中的加壳技术,如果有不明白的可以查看我的上一篇博客http://my.oschina.net/u/2323218/blog/3...

34911
来自专栏技术博文

Linux Bash Shell入门教程

BASH 的基本语法 最简单的例子 —— Hello World! 关于输入、输出和错误输出 BASH 中对变量的规定(与 C 语言的异同) ...

3474
来自专栏Crossin的编程教室

浅谈 Python 2 中的编码问题

Python 2.x 里的编码实在是一件令人烦躁的事情。不断有初学者被此问题搞得晕头转向。我自己也在很长一段时间内深受其害,直到现在也仍会在开发中偶尔被坑。在本...

33914
来自专栏架构师小秘圈

shell脚本极简教程

一,shell题记 不懂shell的程序员不是好程序员,学习shell是为了自动化,使用自动化可以非常有效的提高工作效率。没有一个大公司不要求linux的基本技...

3586
来自专栏于晓飞的专栏

Android Proguard(混淆)

最近项目中遇到一些混淆相关的问题,由于之前对proguard了解不多,所以每次都是面向Stackoverflow的编程。copy别人的答案内心还可以接受,但是c...

1403
来自专栏linux驱动个人学习

Linux进程ID号--Linux进程的管理与调度(三)【转】

Linux 内核使用 task_struct 数据结构来关联所有与进程有关的数据和结构,Linux 内核所有涉及到进程和程序的所有算法都是围绕该数据结构建立的,...

1121

扫码关注云+社区