使用反射调用类的私有内部类的私有方法

这篇具有很好参考价值的文章主要介绍了使用反射调用类的私有内部类的私有方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


在进行单元测试时,我们往往需要直接访问某个类的内部类或者某个类的私有方法,此时正常的调用就无能为力了,因此我们可以使用反射进行调用。

使用反射调用类的私有方法

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 {

	@Test
	final 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);
		
		
	}

	@Test
	final 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 {
	@Test
	final 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);
			
	}
	
	@Test
	final 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);		
	}


}

文章来源地址https://www.toymoban.com/news/detail-728924.html

到了这里,关于使用反射调用类的私有内部类的私有方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java进阶(7)——手动实现LinkedList & 内部node类的实现 & 增删改查的实现 & toString方法 & 源码的初步理解

    1.linkedList的节点,当前,上一个,下一个的思想; 2.根据index找node的方法,根据index确定从头部还是尾部; 3.linkedlist的增删改查的实现,本质是改变节点的信息; 4.递归方法实现自定义链表的toString方法; Java进阶(3)——手动实现ArrayList 源码的初步理解分析 数组插入数据和

    2024年02月11日
    浏览(51)
  • java内部类的创建

    创建内部类非常简单,就是在类中定义另外一个类。 内部类,实际上就是类的嵌套。 2.1 创建 内部类如何访问外部类成员? 可以通过 外部类名称.this 的形式来获得外部类对象的引用; 上例中的 System.out.println(Outer.this.index)等价于System.out.println(index) ; 一般情况下,无需这么麻

    2023年04月19日
    浏览(31)
  • 静态内部类的访问方法(static/无static)

    笔记汇总: 《Java面向对象程序设计》学习笔记 用static修饰内部类,可以直接通过内部类类名访问静态内部类。 没有用static修饰内部类,则需要new一个外部类实例,再通过外部实例创建内部类。 外部类之外创建内部类对象_new通过外部类创建内部类对象_Dingwensheng1222的

    2024年02月14日
    浏览(46)
  • 【Python】面向对象 - 封装 ② ( 访问私有成员 | 对象无法访问私有变量 / 方法 | 类内部访问私有成员 )

    在下面的 Python 类 Student 中 , 定义了私有的成员变量 , 该私有成员变量 , 只能在类内部进行访问 , 类的外部无法进行访问 ; 在 类外部 创建的 Student 实例对象 , 是无法访问 __address 私有成员的 ; 使用 实例对象 访问 类的私有成员 , 编译时不会报错 , 但是运行时会报错 最后一行代

    2024年02月13日
    浏览(49)
  • Java语言------四种内部类的详细讲解

    目录 一.内部类的介绍 二.内部类的种类 2.1实例内部类       2.2.静态内部类 2.3局部内部类 2.4匿名内部类 总结        内部类: 一个类定义在  另一个类  的  内部。        内部类分为 四种 : 实例内部类、静态内部类、局部内部类、匿名内部类。 使用时机:当一个事

    2023年04月25日
    浏览(43)
  • java反射的基本使用方法

    当我们使用 Java 开发时,有时需要获取某个类的信息,例如类的属性、方法和构造函数等,然后在程序运行期间动态地操作它们。Java 反射就是用来实现这个目的的一种机制。 Java 反射(Reflection)是 Java 编程语言在运行时动态获取类的信息以及动态调用对象方法的能力。它可

    2024年02月16日
    浏览(38)
  • Java进程ProcessBuilder类的介绍及使用,ProcessBuilder调用外部程序执行shell命令Linux命令

    目录 ProcessBuilder类的介绍及使用 【前言】 【正文】 --构造方法-- --常用方法-- --使用技巧-- --调用本地Shell命令,实例-- 【总结】 【注意】         在做一个项目的时候需要用到运行时动态执行JAVA命令,一开始的思路是运行时生成bat脚本,然后通过Runtime类的exec方法之行

    2024年02月09日
    浏览(43)
  • C# 通过反射以及动态调用方法

    有时候需要通过反射以及动态调用的办法去调用已知的实例的方法,感觉还是挺巧妙的。以下主要记录通过反射以及动态的调用方法。 运行结果如下图所示: 总结:在已知方法的情况下,还是动态调用比较方便,但是要注意异常处理,毕竟这属于特殊情况,编译执行前不会

    2024年02月07日
    浏览(50)
  • Java 8 中使用反射进行命令执行的 5 个方法

    今天在逛先知的时候看到了一篇文章:《探究使用反射进行除Runtime的命令执行方法》https://xz.aliyun.com/t/12446 其中大概讲了下命令执行的其他构造方式,但最后没有给出实例,所以我这里就简单研究了一下。 在RASP等安全产品防护严密的现在,普通的寻找Runtime.getRuntime().exec(c

    2023年04月20日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包