某些特殊情况下我们需要调用类的私有方法,这时候我们就可以用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函数,但是程序还是正常运行来。