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

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

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

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

代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
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下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

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