反射访问私有方法输入疑问

反射访问私有方法输入疑问

请问老师,访问私有方法必须要先获取构造方法,然后再调用newInstance方法吗?我写的测试私有方法,在执行invoke调用方法时,传入的参数如图所示,代码就运行没结果,只有写newInstance返回的对象时才对,请问老师这是为什么?为什么不能直接传class获取的对

https://img1.sycdn.imooc.com/climg/654b9a7b0940ac9f14820548.jpg

代码如下

public class Example01 {
	private String name;
	private int age;
	
	private Example01() {
		System.out.println("构造方法");
	}
	
	private Example01(String name,int age) {
		this.name=name;
		this.age=age;
	}
	
	private void people(String name,Integer age) {
		System.out.println(name+"今年"+age+"岁了");
	}
	
	private void people() {
		System.out.println("夏天的风~~~~~");
	}
}


public class ExampleTest {
	@Test	//获取私有方法
	public void test01() throws Exception {
		Class example=Example01.class;//获取class对象
//		//获取类的构造方法(获取构造器的作用:初始化一个对象返回)
//		Constructor constructor = example.getDeclaredConstructor();
//		//如果是非public的构造器,需要打开权限(暴力反射),然后再创建对象
//		constructor.setAccessible(true);
//		//创建类的实例
//		Object newInstance = constructor.newInstance();
		
		//获取私有方法people(有参数情况)
		Method declaredMethod = example.getDeclaredMethod("people",String.class,Integer.class);
		//设置方法为可访问
		declaredMethod.setAccessible(true);
		//运行方法
		declaredMethod.invoke(example,"uuu",99);
		
		//获取私有方法people(无参数情况)
		Method declaredMethod2 = example.getDeclaredMethod("people");
		declaredMethod2.setAccessible(true);
		declaredMethod2.invoke(example);
	}

正在回答

登陆购买课程后可参与讨论,去登陆

1回答

同学你好,同学代码中尝试调用Example01类中的成员方法,那么就需要先创建Example01类的对象。调用方法时必须有当前类的对象,这与调用方法的方式没关系(无论是通过反射还是一般调用方式),是必须的满足的语法要求。

同学提供的截图中,如果不调用newInstance方法,而是直接使用example变量去调用时,会抛出异常。主要原因是,example所存储的是Example01类的类对象而不是Example01类的实例(也称为类的对象),而类对象中是没有这个方法的,就不能调用。

需要注意的是,上面一句中“类对象中是没有这个方法的”,是只没有定义过这个方法,需要与Method属性进行区分。

如果将注释中的代码放开,那么调用时就满足条件了,先创建了Example01类的实例,然后使用这个实例去调用方法,就没问题了。

祝学习愉快~

  • 停停停呀 提问者 #1

    请问老师,Class example=Example01.class;与Example01 e=new Example01();所创建的对象有什么区别吗?example是不是不能直接调用Example01类的方法?只有e可以?

    2023-11-09 13:10:16
  • 好帮手慕小蓝 回复 提问者 停停停呀 #2

    同学你好,两者有本质的区别。前者获取的是类对象,类型是Class类型的,后者是类的实例,类型是Example01类型的。只有对应类型才能调用其中的方法,例如只有Example01类型才能调用Example01类中的方法。

    祝学习愉快~

    2023-11-09 13:15:29
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师