java反射机制调用私有方法

本文介绍了如何使用Java反射机制来调用类的私有方法,通过实例代码展示了具体操作过程,并阐述了反射机制在解决模块间依赖问题时的作用。在演示过程中,修改方法名以突出反射机制在处理不存在的方法调用时的容错性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

某些特殊情况下我们需要调用类的私有方法,这时候我们就可以用java的反射机制来实现这一需求。
下面直接上代码
调用MyMethod的私有方法setPeople

public class MyMethod {
    private String mName = "wang";
    private int mNumber = 100;

    public String getName(){
        return mName;
    }

    public int getNumber(){
        return mNumber;
    }

    private void setPeople(String newName, int newNumber){
        mName = newName;
        mNumber = newNumber;
    }
}
import java.lang.reflect.Method;

public class ReflectionMethod {

    public static void main(String[] args) throws Exception{
        MyMethod mClass = new MyMethod();
        Class<?> classType = mClass.getClass();

        System.out.println("111 mName = "+mClass.getName()+", mNumber = "+mClass.getNumber());

        //log可以看到classType和MyMethod.class是一样的
        System.out.println("Class = "+classType);
        System.out.println("Class = "+MyMethod.class);

        try {
            // 获取Method对象,其中setPeople为函数名,String.class和int.class分别为它的两个参数类型
            Method method = classType.getDeclaredMethod("setPeople", new Class[] { String.class, int.class });
            System.out.println("method = "+method);

            // 抑制Java的访问控制检查,不写这句下面访问私有方法时将报错。
            method.setAccessible(true); 

            //这里调用mClass的method方法,后面两个为method的参数
            method.invoke(mClass, "zhangsan", 90);
        }catch (NoSuchMethodException e) {
            System.out.println("error: "+e);
        }catch (IllegalAccessException e) {
            System.out.println("error: "+e);
        }

        System.out.println("222 mName = "+mClass.getName()+", mNumber = "+mClass.getNumber());
        System.out.println("finish! ");
    }
}

最后来看下LOG
111 mName = wang, mNumber = 100
Class = class MyMethod
Class = class MyMethod
method = private void MyMethod.setPeople(java.lang.String,int)
222 mName = zhangsan, mNumber = 90
finish!
从log可以看出,成功实现了setPeople方法

这里顺便说一下用反射机制的一大用就是,当我们作为一个项目的独立模块需要调用外部类,而在集成之前我们并没有这个接口可以调用,
导致必然编译不过而无法测试其他功能,这时候我们可以用如上反射方法来事先做好接口调用。
这里我们将ReflectionMethod.java中的Method method = classType.getDeclaredMethod(“setPeople”, new Class[] { String.class, int.class });改成
Method method = classType.getDeclaredMethod(“XXXX”, new Class[] { String.class, int.class });
然后编译运行LOG如下
111 mName = wang, mNumber = 100
Class = class MyMethod
Class = class MyMethod
error: java.lang.NoSuchMethodException: MyMethod.XXXX(java.lang.String, int)
222 mName = wang, mNumber = 100
finish!

可以看到没有XXXX函数,但是程序还是正常运行来。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值