反射访问私有方法输入疑问
请问老师,访问私有方法必须要先获取构造方法,然后再调用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); }
11
收起
正在回答
1回答
同学你好,同学代码中尝试调用Example01类中的成员方法,那么就需要先创建Example01类的对象。调用方法时必须有当前类的对象,这与调用方法的方式没关系(无论是通过反射还是一般调用方式),是必须的满足的语法要求。
同学提供的截图中,如果不调用newInstance方法,而是直接使用example变量去调用时,会抛出异常。主要原因是,example所存储的是Example01类的类对象而不是Example01类的实例(也称为类的对象),而类对象中是没有这个方法的,就不能调用。
需要注意的是,上面一句中“类对象中是没有这个方法的”,是只没有定义过这个方法,需要与Method属性进行区分。
如果将注释中的代码放开,那么调用时就满足条件了,先创建了Example01类的实例,然后使用这个实例去调用方法,就没问题了。
祝学习愉快~
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星