我们是Java开发人员,在Java中已知4种访问修饰符:私有,受保护,公共和包。 好吧,除了私有外,最后三个可以通过继承,相同的包或实例从类外部调用。

现在,常见的问题是,可以公开(从外部类中)公开私有吗? 答案是否定的。 使用“常规”方式访问它时为“否”,而使用Java本身提供的Reflection API“侵入”它时为“是”。

好吧,现在编写我们将要破解的代码。 我称它为“ 受害者

package com.namex.hack;public class TheVictim {private void hackTest() {System.out.println("hackTest called");}private static void hackTestStatic() {System.out.println("hackTestStatic called");}}

现在,在此之后,只需遵循我的代码并尝试运行它即可。 我保证,如果您遵循正确,将使TheVictim调用hackTesthackTestStatic 。 您可以在屏幕上看到输出。

package com.namex.hack;import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;public class HackTest {public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException {Class c = TheVictim.class;Method[] ms = c.getDeclaredMethods();for (Method each : ms) {String methodName = each.getName();each.setAccessible(true); // this is the keyif (Modifier.isPrivate(each.getModifiers())) {if (Modifier.isStatic(each.getModifiers())) {// static doesnt require the instance to call it.each.invoke(TheVictim.class, new Object[] {});} else {each.invoke(new TheVictim(), new Object[] {});}}}}
}

输出示例

hackTestStatic called
hackTest called

好的,本教程已达到目的。 现在您知道Java的Reflection API是编程语言的非常强大的功能。 完全取决于您自己的目的来修改或扩展它。 玩Java

参考: 公开调用私有方法? 来自我们的JCG合作伙伴 Ronald Djunaedi,来自Naming Exception博客。

翻译自: https://www.javacodegeeks.com/2012/06/calling-private-java-methods-publicly.html

公开调用私有Java方法?相关推荐

  1. ajax调用后台java方法,jquery ajax再次封装,前台调用后台java方法直接返回数据

    一,前台js部分代码 /** * bean参数格式:类全限定名.方法名  opt参数格式:键值对  handleResponse:会function类型参数包含一个参数data,为后台返回json数据 ...

  2. android webview java_Android Webview中调用本地java方法

    在网页调用本地的分享SDK class JsObject { @JavascriptInterface public String toString() { return "injected ...

  3. JNI中C调用Java方法

     我们需要在JNI的C代码调用Java代码.实现原理:使用JNI提供的反射借口来反射得到Java方法,进行调用. JNI关键方法讲解. 1. 在同一个类中,调用其他方法 JNIEXPORT voi ...

  4. cocos2d js调用java_【cocos2d-js官方文档】二十四、如何在android平台上使用js直接调用Java方法...

    在cocos2d-js 3.0beta中加入了一个新特性,在android平台上我们可以通过反射直接在js中调用java的静态方法.它的使用方法很简单: var o = jsb.reflection. ...

  5. 本地方法(JNI)——调用 java 方法

    [0]README 1) 本文部分文字描述 转自 core java volume 2 , 旨在理解 本地方法(JNI)--调用 java 方法 的基础知识 : 2) C语言调用java 方法,包括: ...

  6. android jni 结构体_Android应用开发Android JNI-c/c++调用java方法

    本文将带你了解Android应用开发Android JNI-c/c++调用java方法,希望本文对大家学Android有所帮助. " Android   JNI-c/c++调用java方法, ...

  7. 【cocos2d-js官方文档】二十四、如何在android平台上使用js直接调用Java方法

    在cocos2d-js 3.0beta中加入了一个新特性,在Android平台上我们可以通过反射直接在js中调用Java的静态方法.它的使用方法很简单: var o = jsb.reflection. ...

  8. C++调用Java方法

    最近在搞JNI那块,发现网上很多都是Java调用JNI,然后再调用C++的方法.而当C++函数里调用Java的方法,网上的文章可以说是少之又少,所以写此篇文章共勉.... 本文介绍两种方法,一是C++ ...

  9. Java方法完整调用链生成工具

    1. 前言 在很多场景下,如果能够生成Java代码中方法之间的调用链,是很有帮助的,例如分析代码执行流程.确认被修改代码的影响范围.代码审计/漏洞分析等. IDEA提供了显示调用指定Java方法向上的 ...

最新文章

  1. Linux下用户组、文件权限
  2. 最佳拟合直线_JAVA
  3. ERC20 Short Address Attack
  4. VMware共享文件夹遇到的问题
  5. Android中文API(136) —— Bitmap
  6. html保存导入word文档格式,WordPress网站在导入Word文档时如何保持原有格式
  7. 67.二进制求和 (力扣leetcode) 博主可答疑该问题
  8. 3D数学基础学习笔记(Unity3d)
  9. ngod规范_[转载]NGOD一些感悟
  10. 超图s3m服务加载时添加token
  11. 12 序列化器Serializer的使用
  12. Canoe-基于14229的UDS自动化测试脚本CAPL 这适用于CANoe无diva的测试脚本
  13. 视觉SLAM十四讲笔记-第四讲 李群与李代数
  14. oswatch的安装和使用(转)
  15. 基于Python/Capl脚本 对通信矩阵报文(Flexray/Can)的周期检测(二)
  16. Js放在head和body中的区别
  17. java驱动打印机_本地打印机驱动程序如何找到网络打印机?
  18. DM3730 上实现WM6
  19. EasyExcel 实现多个Sheet页导出
  20. java抓取工具_抓取工具Web-Harvest - dayang2001911 - JavaEye技术网站

热门文章

  1. (精华)转:RDD:创建的几种方式(scala和java)
  2. kata_FizzBu​​zz Kata与Java流
  3. java8 从数组获取流_从数组到流再到Java 8
  4. jboss eap 7.0_是时候抛弃Java 7 – JBoss EAP 6.4了!
  5. 图片大小 媒体大小自适应_自适应堆大小
  6. 如何在CircleCI上构建支持Graal的JDK8?
  7. 自动化测试在CI CD管道中的作用
  8. 使用CUBA进行开发–是Spring的重大转变吗?
  9. java web 刷新_Java Web项目的保存和刷新
  10. @async方法不调用了_在Spring中使用Future对象调用Async方法调用