天天看点

java反射机制调用私有方法

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

下面直接上代码

调用MyMethod的私有方法setPeople

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

    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", );
        }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函数,但是程序还是正常运行来。

继续阅读