Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >分享调用Java private方法

分享调用Java private方法

作者头像
宋凯伦
发布于 2018-01-04 07:14:32
发布于 2018-01-04 07:14:32
1.5K0
举报

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【Android NDK 开发】JNI 方法解析 ( C/C++ 调用 Java 方法 | 函数签名 | 调用对象方法 | 调用静态方法 )
调用 jclass GetObjectClass(jobject obj) 或 jclass FindClass(const char* name) 方法 , 获取 jclass 类型变量 ;
韩曙亮
2023/03/27
9K0
【Android NDK 开发】JNI 方法解析 ( C/C++ 调用 Java 方法 | 函数签名 | 调用对象方法 | 调用静态方法 )
JNI开发总结
Android Ndk开发常用网站收集,真正的高手并不是掌握所有的API而是需要的时候可以快速的找到要使用的API。
Anymarvel
2018/10/22
1.7K0
JNI开发总结
你应该了解的JNI知识(二)——Java与JNI互相调用
在你应该了解的JNI知识(一)——静态注册与动态注册中,了解了JNI是如何使用的,以及两种注册方式的使用以及区别。本篇博客将介绍Java和JNI的互相调用,因此主要包括两部分:
用户1108631
2019/08/17
1.9K0
Java调用C/C++那些事(JNI)
比如说,对于某些特定功能,C/C++已有代码实现,但是Java没有。为了可以让Java成功使用该功能,有几种方式:
掂过碌蔗啊
2025/01/19
1.8K0
Android 通过 JNI 访问 Java 字段和方法调用
在前面的两篇文章中,介绍了 Android 通过 JNI 进行基础类型、字符串和数组的相关操作,并描述了 Java 和 Native 在类型和签名之间的转换关系。
音视频开发进阶
2019/07/26
1.2K0
JNI--c/c++调用Java方法
上次说到c/c++调用Java的变量,同样的c/c++也可以调用Java的方法 1.c/c++native方法调用Java非静态方法 首先看下我们Java的类 package com.aruba.jniapplication; import java.util.Random; public class JniDemo2 { static { System.load("C:\\Users\\tyqhc\\source\\repos\\JniApplication\\x64\\De
aruba
2020/07/03
4.8K0
JNI回调Java
实例/对象的引用 两种应用场景: 第一种情况是Java层将实例传递下来。 第二种情况是native层拿到jclass对象后,创建jobject实例,并将实例返回给java层,以如何创建一个java层的ArrayList为例:
小蚂蚁与大象
2020/07/23
2.1K0
JNI开发示例
安装:eclipse(http://www.eclipse.org/)、CDT(C/C++ Development Tooling)、ADT(Android Development Tools)
meteoric
2018/11/19
8210
JNI:本地代码调用Java代码
如:env -> GetMethodID(data_Clazz, "<init>", "()V");
BUG弄潮儿
2022/03/08
1.9K0
JNI:本地代码调用Java代码
NDK开发(三) :JNI访问Java变量和方法
选中accessField,按 Alt+Enter快捷添加.cpp中方法Java_com_example_myapplication_MainActivity_accessField
103style
2022/12/19
4890
Android系统JNI使用(JAVA调用C语言接口)一
JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信主要是C/C++。
李小白是一只喵
2020/04/23
1.5K0
Android系统JNI使用(JAVA调用C语言接口)一
JAVA native关键字
reference https://stackoverflow.com/questions/6101311/what-is-the-native-keyword-in-java-for
平凡的学生族
2019/05/25
4340
NDK开发案例 | C/C++调用java层代码
随笔分类 - jni NDK开发(三)——C/C++代码如何调用java层代码 E:\AndroidProject\TheTestPro\NDKDemo\app\build\intermediates\javac\debug\classes>javap -s -p com.lwp.ndkdemo.MainActivity Compiled from "MainActivity.java" public class com.lwp.ndkdemo.MainActivity extends androidx.a
凌川江雪
2020/07/22
5660
【Android FFMPEG 开发】C++ 回调 Java 方法 模板 ( JavaVM *vm | JNIEnv *env | jobject instance | 引用类型 | 模板代码示例 )
1 . 前置知识点 : 参考 【Android NDK 开发】JNI 方法解析 ( C/C++ 调用 Java 方法 | 函数签名 | 调用对象方法 | 调用静态方法 ) 博客内容 , 了解如何在 C++ 中调用 Java 方法 ;
韩曙亮
2023/03/27
1.1K0
【Android FFMPEG 开发】C++ 回调 Java 方法 模板 ( JavaVM *vm | JNIEnv *env | jobject instance | 引用类型 | 模板代码示例 )
android JNI调用机制
JNI的出现使得开发者既可以利用Java语言跨平台、类库丰 富、开发便捷等特点,又可以利用Native语言的高效。 JNI是JVM实现中的一部分,因此Native语言和Java代码都运行在JVM的
xiangzhihong
2018/02/01
1.9K0
android JNI调用机制
详解java之JVM内存机制
为什么要学习 jvm 优化呢?其实 jvm 优化不是对 java 系统优化提升性能最明显的方式。可以从很多侧面来对 java 虚拟机的性能进行优化。着手于哪几面呢?
用户1413827
2023/11/28
2990
详解java之JVM内存机制
Android学习JNI,使用C调用JAVA语言
本节学习使用C语言调用JAVA语言。在生活中比如我们某些底层的硬件必须使用C语言去编写,当C语言返回的某些数值显示在界面上时,就比如使用JNI。这样可以将C返回的值显示在界面上。
DragonKingZhu
2022/05/08
4430
Android学习JNI,使用C调用JAVA语言
如何用反射突破private方法的限制
反射作为Java的一个提高点,经常作为面试的内容之一。今天介绍一下最基本的反射的使用。 如何用反射来使用Class中的private方法。
PhoenixZheng
2018/08/07
1.4K0
Android的JNI【实战教程】3⃣️--Java调用C代码
看了上一篇: http://blog.csdn.net/github_33304260/article/details/62891083 我们应该已经可以构建NDK工程了 , 接下来让我们看看Java调用C代码:
先知先觉
2019/01/21
1K0
深入理解Java中的反射机制和使用原理!详细解析invoke方法的执行和使用
newInstance方法可以根据传入的参数来调用对应的Constructor创建对象的实例
攻城狮Chova
2022/02/24
2.1K0
深入理解Java中的反射机制和使用原理!详细解析invoke方法的执行和使用
相关推荐
【Android NDK 开发】JNI 方法解析 ( C/C++ 调用 Java 方法 | 函数签名 | 调用对象方法 | 调用静态方法 )
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档