java 调用私有方法_公开调用私有Java方法?

java 调用私有方法

我们是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 调用私有方法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/356131.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

港航环境变化引起的错误解决方法

1.serlvet API缺少,pom.xml中引入坐标; 2.web.xml中出现错误,将所有的filter调到filtermapping上面去; 3.依赖导入完成后项目依然有红叉,右击项目Propreties->myeclipse->Project Facets->java换成1.6就可以了…

flutter 国际化_从0开始设计Flutter独立APP | 第二篇: 完整的国际化语言支持

鉴于Flutter高性能渲染和跨平台的优势,闪点清单在移动端APP上,使用了完整的Flutter框架来开发。既然是完整APP,架构搭建完全不受历史Native APP的影响,没有历史包袱的沉淀,设计也能更灵活和健壮。国际化语言的支持&…

将旧版本从Java EE 5减少到7

Java EE 5于2005年首次引入,而Java EE 7于2013年问世。这两个版本之间有7年的差距,从技术角度来说,这就像一个世纪。 许多组织仍然对使用Java EE 5感到困惑,并且有很多正当理由选择不升级。 不过,如果您考虑一些前进的…

sql插入临时表数据的方法

方法有两种,主要看需求。 方法1:定义好临时表的字段和类型、插入对应的值 create table #Tmp --创建临时表#Tmp (City varchar(50), --Country varchar(50), -- );insert #Tmp select 北京,中国 union select 东京,日本 union select 纽约,美国 se…

gulp

1.gulp是什么? gulp是前端开发过程中一种基于流的代码构建工具,是自动化项目的构建利器;她不仅能对网站资源进行优化,而且在开发过程中很多重复的任务能够使用正确的工具自动完成;使用她,不仅可以很愉快的编…

往vxe-table添加渲染器怎么添_赚大了!飘窗上装书桌,加扇折叠窗,等于为家里又多添一间房...

阅读本文前,请您先点击上面蓝色字体,再点关 注这样您就可以继续免费收到文章注:本文转载自网络,如有侵权,请在后台留言联系我们进行删除,谢谢! …

【六大排序详解】中篇 :选择排序 与 堆排序

选择排序 与 堆排序 选择排序 选择排序 与 堆排序1 选择排序1.1 选择排序原理1.2 排序步骤1.3 代码实现 2 堆排序2.1 堆排序原理2.1.1 大堆与小堆2.1.2 向上调整算法2.1.3 向下调整算法 2.2 排序步骤2.3 代码实现 3 时间复杂度分析 Thanks♪(・ω・)&#…

java中contains的用法_java容器中所有接口和类的用法

我这里讲一下如何下载java的api文档还有就是容器和容器之间进行的操作每一个地方称之为一个节点,每一个节点包含了3部分(上一个节点,下一个节点,以及我们自己的数据部分)需要多个线程共享的时候通过键对象来找值对象1 java中的length属性是针…

lcs文本相似度_具有LCS方法的通用文本比较工具

lcs文本相似度常见的问题是检测并显示两个文本的差异(尤其是几百行或几千行)。 使用纯java.lang.String类方法可能是一种解决方案,但是对于此类操作最重要的问题是,“性能”将不能令人满意。 我们需要一种有效的解决方案&#xff…

MySQL--开发技巧(一)

Inner Join: Left Outer Join: Right Outer Join: Full Join: Cross Join: SELECT t1.attrs ,t2.attrs FROM t1 CROSS JOIN t2 使用Join更新表: UPDATE table1 SET attr2 WHERE attr1 IN (SELECT table2.attr1 FROM table1 INNER JOIN table2 ON tab…

js url解码gbk_使用js解码gbk编码的字符串

如下字符串为 “产后恢复肚子”%B2%FA%BA%F3%BB%D6%B8%B4%B2%D9%CA%D3%C6%B5%BD%CC%B3%CC直接使用js的解码函数解码得到的都是乱码,可以使用下面的函数进行解码/*** js解码gbk url编码的字符串* param {[type]} str gbk编码字符串* param {[type]} charset 字符串的…

mysql 5.7 insert_MySQL5.7 支持一个表有多个INSERT/DELETE/UPDATE触发器

在MySQL5.6版本里,不支持一个表有多个INSERT/DELETE/UPDATE触发器。例如创建t1表两个INSERT的触发器:DELIMITER $$USE test$$DROP TRIGGER /*!50032 IF EXISTS */ t1_1$$CREATE/*!50017 DEFINER ‘admin‘‘%‘ */TRIGGER t1_1 AFTER INSERT ON t1FOR E…

Java回调机制解读

模块间调用 在一个应用系统中,无论使用何种语言开发,必然存在模块之间的调用,调用的方式分为几种: (1)同步调用 同步调用是最基本并且最简单的一种调用方式,类A的方法a()调用类B的方法b()&#…

Java TDD简介–第1部分

欢迎来到测试驱动开发 (TDD)系列的介绍。 我们将在TDD上下文中讨论Java和JUnit ,但这只是工具。 本文的主要目的是使您全面了解TDD,而无论使用哪种编程语言和测试框架。 如果您在项目中不使用TDD,那么您要么很懒&…

状态模式 处理订单状态_将状态机模式实现为流处理器

状态模式 处理订单状态在我的上一个博客中,我说过我真的以为某些“四人行”(GOF)模式已经过时了,如果不是过时的话肯定不受欢迎。 特别是我说过StateMachine没什么用,因为您通常会想到另一种更简单的方式来执行您正在执…

mysql 连续签到天数_最大连续签到天数-sql

SELECT MIN(rq) as 起始日期, MAX(rq) as 终止日期, MAX(id1) - MIN(id1) 1 as 持续天数,id3 as 累计签到天数,nameFROM (SELECT datediff(rq,2020-02-01 )id1, (SELECT COUNT(1)FROM tmptableWHERE rq < a.rq andtype 是) id2,(SELECT COUNT(1)FROM tmptableWHEREtype 是…

mysql 两个查询结果合并去重_《MySQL 入门教程》第 21 篇 集合操作符

文章来源&#xff1a;https://blog.csdn.net/horses/article/details/108174837来源平台&#xff1a;CSDN原文作者&#xff1a;不剪发的Tony老师数据表与集合理论中的集合非常类似&#xff0c;表是由行组成的集合。SQL 标准定义了基于行的各种集合操作&#xff1a;并集运算(UNI…

binutils工具集之---ar

1.如果要将多个.o文件生成一个库文件&#xff0c;则存在两种类型的库&#xff0c;一种是静态库&#xff0c;在linux里面后缀是.a&#xff0c;另一种是动态库&#xff0c;后缀为.so。 当可执行程序要与静态库进行链接时&#xff0c;所用到的库中的函数和数据会被拷贝到最终的可执…

jax-rs jax-ws_Google App Engine JAX-RS REST服务

jax-rs jax-ws在本文中&#xff0c;您将学习如何使用JAX-RS参考实现&#xff08;Jersey&#xff09;创建REST服务并将其部署在Google AppEngine上。 先决条件 对于本教程&#xff0c;您将需要&#xff1a; 一个Google AppEngine帐户 Eclipse Galileo&#xff08;3.5.x&#xf…

[转]使用C#开发ActiveX控件

前言 ActiveX控件以前也叫做OLE控件&#xff0c;它是微软IE支持的一种软件组件或对象&#xff0c;可以将其插入到Web页面中&#xff0c;实现在浏览器端执行动态程序功能&#xff0c;以增强浏览器端的动态处理能力。通常ActiveX控件都是用C或VB语言开发&#xff0c;本文介绍另一…