今天来讲讲 Java的反射机制如何调用其他类的 private 方法
主要有两个重点,一是调用的是getDeclaredMethod
二是****调用private方法的最最关键一句话 *********
strMethod.setAccessible(true);
上代码
package com.fs.reflect;
/*
* 定义一个Person类
*/
public class Person {
/*
* 下面主要是反射调用调用两个add方法
*/
public String address;
public int phone;
public int add(int num1,int num2){
System.out.println("Person --->num1+num2="+(num1+num2));
return num1+num2;
}
public int add(int num1) {
System.out.println("num1 = "+num1);
return num1;
}
private String add(String data) {
System.out.println("Person ---> data = "+data);
return data;
}
}
package com.fs.reflect;
import java.lang.reflect.Method;
public class Main {
public static void main(String[] args) throws Exception {
//找到要反射的类,并创建实例
Person p = new Person();
Class<?> cp = p.getClass();
Object invokeAdd = cp.newInstance();
/*
* 参数一是方法名,当然你可以先把所有方法打印出来看看,这在上一篇内容已经说过,不懂的去上一篇看看
* 参数二是为了区分函数重载,按照参数个数不同加以区分,两个
* */
//addMethod是获取类的方法
Method addMethod = cp.getMethod("add", new Class[]{int.class,int.class});
//用类的对象去调用函数,因为不知道有没有返回值,
//有返回值时又不知道其类型,所以用Object存储,最后强转为你需要的类型即可
Object result = addMethod.invoke(invokeAdd, new Object[]{4,6});
//转为int类型的值,自动装拆箱
System.out.println((Integer)result);
/**
* 打印结果如下
* Person --->num1+num2=10
* 10
*
*/
/**
* 公有方法可以调用,那私有方法呢?
*/
Method strMethod = cp.getDeclaredMethod("add", new Class[]{String.class});
// ****调用private方法的最最关键一句话 *********
strMethod.setAccessible(true);
//用类的对象去调用函数,因为不知道有没有返回值,
//有返回值时又不知道其类型,所以用Object存储,最后强转为你需要的类型即可
Object res = strMethod.invoke(invokeAdd, new Object[]{"private method run"});
System.out.println((String)res);
/**
* 打印结果如下
* Person ---> data = private method run
* private method run
*
*/
/**
* 连私有方法都能调用,请问你有什么事不能干呢?调用私有成员也是类似操作,赶紧试试吧
*/
}
}
赶紧练习练习吧
运行结果: