您的位置:首页 > 编程语言 > Java开发

java反射机制调用私有方法

2016-02-22 18:35 681 查看
某些特殊情况下我们需要调用类的私有方法,这时候我们就可以用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函数,但是程序还是正常运行来。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: