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

代码如下
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);
}正在回答
同学你好,同学代码中尝试调用Example01类中的成员方法,那么就需要先创建Example01类的对象。调用方法时必须有当前类的对象,这与调用方法的方式没关系(无论是通过反射还是一般调用方式),是必须的满足的语法要求。
同学提供的截图中,如果不调用newInstance方法,而是直接使用example变量去调用时,会抛出异常。主要原因是,example所存储的是Example01类的类对象而不是Example01类的实例(也称为类的对象),而类对象中是没有这个方法的,就不能调用。
需要注意的是,上面一句中“类对象中是没有这个方法的”,是只没有定义过这个方法,需要与Method属性进行区分。
如果将注释中的代码放开,那么调用时就满足条件了,先创建了Example01类的实例,然后使用这个实例去调用方法,就没问题了。
祝学习愉快~
- 参与学习 人
- 提交作业 8789 份
- 解答问题 9886 个
综合就业常年第一,编程排行常年霸榜,北上广深月薪过万! 不需要基础,无需脱产即可学习,只要你有梦想,想高薪! 全新升级:技术栈升级(包含VUE3.0,ES6,Git)+项目升级(前后端联调与功能升级)
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星