使用反射调用类的私有内部类的私有方法
文章目录
- 使用反射调用类的私有方法
- 类
- 实现方法
- 实现代码
- 使用反射调用类的私有内部类的私有方法
- 类
- 实现方法
- 实现代码
在进行单元测试时,我们往往需要直接访问某个类的内部类或者某个类的私有方法,此时正常的调用就无能为力了,因此我们可以使用反射进行调用。
使用反射调用类的私有方法
类
package net.mooctest;public class outClass{public outClass() {}private void testMethod1(){System.out.println("调用了outClass的私有方法testMethod1");}//带参数的方法private void testMethod2(int a){System.out.println("调用了outClass的私有方法testMethod2,传入参数为:" + a);}
}
实现方法
- 获取类的Class对象
Class class = Class.forName("类名")
或Class class = 类实例.getClass()
- new一个实例
Object object = class.newInstance();
- 获取私有方法
Method method = class.getDeclaredMethod("方法名",参数类型1.class,参数类型2.class,...);
- 设置方法可访问
method.setAccessible(true);
- 调用私有方法
method.invoke(类实例,参数1,参数2,...);
实现代码
import static org.junit.jupiter.api.Assertions.*;import java.lang.reflect.Method;import org.junit.jupiter.api.Test;import net.mooctest.outClass;class outClassTest {@Testfinal void test1() throws Exception {outClass out = new outClass();Class class1 = out.getClass();Object object = class1.newInstance();//获取私有方法Method method = class1.getDeclaredMethod("testMethod1");//设置方法可访问method.setAccessible(true);//调用方法method.invoke(object);}@Testfinal void test2() throws Exception {outClass out = new outClass();Class class1 = out.getClass();Object object = class1.newInstance();//获取有参私有方法Method method = class1.getDeclaredMethod("testMethod2",int.class);//设置方法可访问method.setAccessible(true);//调用方法method.invoke(object,10);}}
使用反射调用类的私有内部类的私有方法
类
package net.mooctest;public class outClass{public outClass() {}private void testMethod1(){System.out.println("调用了outClass的私有方法testMethod1()");}//带参数的方法private void testMethod2(int a){System.out.println("调用了outClass的私有方法testMethod2(),传入参数为:" + a);}private class inClass{public inClass() {// TODO Auto-generated constructor stub}public inClass(int a) {System.out.println("调用了有参构造器 " + a);}private void inMethod1() {System.out.println("调用了类的私有内部类的私有方法inMethod1()");}}
}
实现方法
- 获取私有内部类的Class对象
Class class = Class.forName("外部类名$内部类名")
- 获取私有内部类构造器,无参构造器参数只填外部类名,有参构造器为(外部类名 ,参数类名…)
Constructor constructor = class.getDeclaredConstructor(outClass.class,参数类型1.class,参数类型2.class,...);
- 设置构造器可访问
constructor.setAccessible(true);
- new一个外部类对象,以便产生内部类实例(outClass:外部类名)
outClass out = new outClass();
- 新建一个内部类实例,参数为外部类实例,若为有参构造器,后面再添加参数
Object object = constructor.newInstance(外部类实例,构造器参数1.class,构造器参数2.class,...);
- 获取私有方法
Method method = class.getDeclaredMethod("inMethod1");
- 设置方法可访问
method.setAccessible(true);
- 调用方法
- method.invoke(object);
实现代码
package test;import static org.junit.jupiter.api.Assertions.*;import java.lang.reflect.Constructor;
import java.lang.reflect.Method;import org.junit.jupiter.api.Test;import net.mooctest.outClass;class outClassTest {@Testfinal void test3() throws Exception {//设置类名,外部类名$内部类名String className = "net.mooctest.outClass$inClass";Class class1 = Class.forName(className);//获取私有内部类构造器,无参构造器参数只填外部类名,有参构造器为(外部类名 ,参数类名...)Constructor constructor = class1.getDeclaredConstructor(outClass.class);//设置构造器可访问constructor.setAccessible(true);//new一个外部类对象,以便产生内部类实例outClass out = new outClass();//新建一个内部类实例,参数为外部类实例,若为有参构造器,后面再添加参数Object object = constructor.newInstance(out);//获取私有方法Method method = class1.getDeclaredMethod("inMethod1");//设置方法可访问method.setAccessible(true);//调用方法method.invoke(object);}@Testfinal void test4() throws Exception {//设置类名,外部类名$内部类名String className = "net.mooctest.outClass$inClass";Class class1 = Class.forName(className);//获取私有内部类构造器,无参构造器参数只填外部类名,有参构造器为(外部类名 ,参数类名...)Constructor constructor = class1.getDeclaredConstructor(outClass.class,int.class);//设置构造器可访问constructor.setAccessible(true);//new一个外部类对象,以便产生内部类实例outClass out = new outClass();//新建一个内部类实例,参数为外部类实例,若为有参构造器,后面再添加参数Object object = constructor.newInstance(out,10);//获取私有方法Method method = class1.getDeclaredMethod("inMethod1");//设置方法可访问method.setAccessible(true);//调用方法method.invoke(object); }}
相关文章:
使用反射调用类的私有内部类的私有方法
文章目录 使用反射调用类的私有方法类实现方法实现代码 使用反射调用类的私有内部类的私有方法类实现方法实现代码 在进行单元测试时,我们往往需要直接访问某个类的内部类或者某个类的私有方法,此时正常的调用就无能为力了,因此我们可以使用反…...

记一次 AWD 比赛中曲折的 Linux 提权
前提背景: 今天一场 AWD 比赛中,遇到一个场景:PHP网站存在SQL注入和文件上传漏洞, MYSQL当前用户为ROOT,文件上传蚁剑连接SHELL是权限很低的用户。我需要想办法进行提权,才能读取到 /root 目录下的 flag。 一、sqlmap …...

[SpringCloud] Feign 与 Gateway 简介
目录 一、Feign 简介 1、RestTemplate 远程调用中存在的问题 2、定义和使用 Feign 客户端 3、Feign 自定义配置 4、Feign 性能优化 5、Feign 最佳实践 6、Feign 使用问题汇总 二、Gateway 网关简介 1、搭建网关服务 2、路由断言工厂 3、路由的过滤器配置 4、全局过…...
[Unity] 个人编码规范与命名准则参考
Unity C# 在写的过程中, 和纯 C# 是有很大出入的. 甚至说, Unity C# 就是邪教. 例如它的命名规范与 C# 是不一致的, 而且由于游戏引擎的介入, 编写时的习惯相较于 C# 来讲, 也需要有所改变. 通用编码规范 常见的一些编码规范就不需要过多提及了, 这里只做简单列举. 添加合适…...

堆栈与队列算法-以链表来实现队列
目录 堆栈与队列算法-以链表来实现队列 C代码 堆栈与队列算法-以链表来实现队列 队列除了能以数组的方式来实现外,也可以用链表来实现。在声明队列的类中,除了和队列相关的方法外,还必须有指向队列前端和队列末尾的指针,即fron…...

快速入门:使用 Spring Boot 构建 Web 应用程序
前言 本文将讨论以下主题: 安装 Java JDK、Gradle 或 Maven 和 Eclipse 或 IntelliJ IDEA创建一个新的 Spring Boot 项目运行 Spring Boot 应用程序编写一个简单的 Web 应用程序打包应用程序以用于生产环境 通过这些主题,您将能够开始使用 Spring Boo…...

01.CentOS7静默安装oracle11g
CentOS7静默安装oracle11g 一、下载Oracle11g安装包二、开始安装oracle11g三、配置Oracle监听程序四、添加数据库实例五、设置开机启动六、登录后解除锁定 一、下载Oracle11g安装包 下载链接:https://pan.baidu.com/s/1gcLMFGX7-8ju7OoFOFLzQA 提取码:6…...
SASE安全访问服务边缘
自存用: 参考文档: 什么是安全访问服务边缘 (SASE)? | Microsoft 安全 网安人必读 |一文读懂SASE - 知乎...

k8s集群升级
目录 1. 部署cri-docker (所有集群节点) 2. 升级master节点 3. 升级worker节点 4. 部署containerd 1. 部署cri-docker (所有集群节点) k8s从1.24版本开始移除了dockershim,所以需要安装cri-docker插件才能使用docker …...

redis原理 主从同步和哨兵集群
主从库如何实现数据一致 我们总说的 Redis 具有高可靠性,又是什么意思呢?其实,这里有两层含义:一是数据尽量少丢失,二是服务尽量少中断。AOF 和 RDB 保证了前者,而对于后者,Redis 的做法就是增…...
四季古诗赏析
春晓 春眠不觉晓,处处闻啼鸟。夜来风雨声,花落知多少。 夏意 别院深深夏簟清,石榴开遍透帘明。树阴满地日当午,梦觉流莺时一声。 秋词 自古逢秋悲寂寥,我言秋日胜春朝。晴空一鹤排云上,便引诗情到碧霄。 …...

【网络协议】聊聊套接字socket
网络编程我们知道是通过socket进行编程的,其实socket也是基于TCP和UDP协议进行编程的。但是在socket层面是感知不到下层的,所以在设置参数的时候,其实是端到端协议智商的网络层和传输层。TCP是数据流所以设置为SOCK_STREAM,而UDP是…...

GEO生信数据挖掘(十一)STRING数据库PPI蛋白互作网络 Cytoscape个性化绘图【SCI 指日可待】
GEO生信数据挖掘(十)肺结核数据-差异分析-WGCNA分析(900行代码整理注释更新版本) 通过 前面十篇文章的学习,我们应该已经可以获取到一个”心仪的基因列表“了,相较于原始基因数量,这个列表的数…...
api接口更新钉钉文档
class OperateKnowledgeBaseExcel():robot_code # agent_id #app_key #群机器人app_secret #群机器人def __init__(self,union_id, workbook_id, worksheet_id):self.union_id union_idself.workbook_id workbook_id # 获取方式:... &g…...
Android---如何同view进行渲染
ViewRootImpl 在 Activity、window 和 View 三者关系之间起着承上启下的作用。一方面,ViewRootImpl 中通过 Binder 通信机制,远程调用 WindowSession 将 View 添加到 Window 中;另一方面,ViewRootImpl 在添加 View 之前࿰…...

【LeetCode:26. 删除有序数组中的重复项 | 双指针】
🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…...
如何判断一个对象是不是一个空对象?
在JavaScript中,可以使用以下方法来判断一个对象是否为空对象: 1:使用Object.keys()方法:Object.keys()方法返回一个包含对象自身可枚举属性的数组。通过判断该数组的长度,可以确定对象是否为空对象。 function isEm…...

C/C++ “variable set but not used“的 警告问题解决方案
在编程的过程中,会有一些预留的变量暂时不用,但是编译过程编译器警告 会报错无法编译通过针对这个问题,采用下面的解决方案比较方便。 错误如下形式: 三种解决方法: 1.可以在变量前加上(void)就…...
JAVA安全入门之反射
反射 对于反射这个概念来说,直白的讲就是: 对象可以通过反射获取他的类,类可以通过反射拿到所有⽅法(包括私有),拿到的⽅法可以调⽤而众所周知 JAVA 是一门静态语言,我们通过反射就可以达到动…...

【c++|opencv】一、基础操作---2.图像信息获取
every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 图像信息获取,roi 1. 图像信息获取 // 获取图像信息#include <iostream> #include <opencv2/opencv.hpp>using namespace cv; …...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲
文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...

数学建模-滑翔伞伞翼面积的设计,运动状态计算和优化 !
我们考虑滑翔伞的伞翼面积设计问题以及运动状态描述。滑翔伞的性能主要取决于伞翼面积、气动特性以及飞行员的重量。我们的目标是建立数学模型来描述滑翔伞的运动状态,并优化伞翼面积的设计。 一、问题分析 滑翔伞在飞行过程中受到重力、升力和阻力的作用。升力和阻力与伞翼面…...

Ubuntu系统多网卡多相机IP设置方法
目录 1、硬件情况 2、如何设置网卡和相机IP 2.1 万兆网卡连接交换机,交换机再连相机 2.1.1 网卡设置 2.1.2 相机设置 2.3 万兆网卡直连相机 1、硬件情况 2个网卡n个相机 电脑系统信息,系统版本:Ubuntu22.04.5 LTS;内核版本…...

leetcode73-矩阵置零
leetcode 73 思路 记录 0 元素的位置:遍历整个矩阵,找出所有值为 0 的元素,并将它们的坐标记录在数组zeroPosition中置零操作:遍历记录的所有 0 元素位置,将每个位置对应的行和列的所有元素置为 0 具体步骤 初始化…...