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

相关文章

来自专栏李鹏的专栏

Java 虚拟机管理的内存运行时数据区域解释

Java 虚拟机在执行 Java 程序的过程中会把它所管理的内存划分为若干个不同数据区域。这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的...

15700
来自专栏Java编程

35 个 Java 代码性能优化总结

代码优化,一个很重要的课题。可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的鲸鱼...

1.9K10
来自专栏吴涛的专栏

apt 与 JavaPoet 自动生成代码

本文通过介绍腾讯视频项目中,adapter 创建 View 的例子,向大家介绍,如何通过自定义注解处理器自动生成代码,以及如何调试自定义注解处理器。首先,介绍一...

2.1K30
来自专栏李鹏的专栏

Java 架构师学习路线

Java 架构师,首先要是一个高级 java 攻城狮,熟练使用各种框架,并知道它们实现的原理。jvm虚拟机原理、调优,懂得 jvm 能让你写出性能更好的代码;池...

65700
来自专栏云资讯小编的专栏

5月 TIOBE 排行榜:Java 和 C 语言正在被超越

自 2016 年初,Java 和 C 语言就出现了明显的下颓趋势,与去年相比,这两种语言的市场占有率均下滑了 6%有余。根据 TIOBE 的数据显示,原本的 J...

79900
来自专栏EarlGrey的专栏

如何快速部署国人开源的 Java 博客系统 Tale

前几天,在社区看到有国人开发者开源了用 Java 写的一个博客系统 Tale。从作者放出的 Demo 站点来看,效果还是不错的。本书梳理了一下部署 Tale 的...

9.5K30
来自专栏Bennyhuo

快速上手 Kotlin 11 招

这篇文章主要是写给需要快速上手 Kotlin 的 Java 程序员看的,这时候他们关注的是如何 Kotlin 写出类似某些 Java 的写法,所以本文基本不涉及...

81920
来自专栏社区的朋友们

理解 JDK 中的 MethodHandle

MethodHandle 更像是在Java语法规则内手写字节码:自己创建方法签名(MethodType),自己决定调用方式,自己注意访问控制 ,最后还要自己决定...

2.6K00
来自专栏世玉的专栏

利用 Jquery + css 自制无限极下拉分类

网上相关例子基本都是 ztree,然后个人去看了看官网,看了半天没找到合适又简单的,ztree,由于界面不适合项目里面的,要是修改他的样式我还可能出现更多的错误...

24710
来自专栏张戈的专栏

【 ES 私房菜 】系统运维数据分析平台架构

网管系统在日常运行过程中会产生各类日志数据,比如 WEB、DB 以及系统等。所以,我们急需一个可以集中收集、分析并输出表报的日志平台,毋庸置疑,ES 就是最佳“...

1.2K10

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励