通过反射机制调用对象中不同修饰符修饰的方法
package test;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* 利用反射获得对象的不同方法
*/
public class Test {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, NoSuchFieldException, InvocationTargetException, InstantiationException, IllegalAccessException {
//先获取Person类的Class对象
Class<?> personClass = Class.forName("test.Person");
//创建对象
Object person = personClass.getDeclaredConstructor().newInstance();
//获取public修饰的方法
Method hi = personClass.getMethod("hi", String.class);
hi.invoke(person, "john");
//调用private修饰的方法
Method say = personClass.getDeclaredMethod("say", String.class, char.class);
//私有方法,进行暴破
say.setAccessible(true);
//如果有返回值则统一封装为Object,但运行类型与方法返回类型一致
System.out.println(say.invoke(person, "hello", 'a'));
//调用静态的private方法
Method eat = personClass.getDeclaredMethod("eat");
//私有方法,进行暴破
eat.setAccessible(true);
eat.invoke(null); //静态方法可使用null代替对象
}
}
class Person {
public void hi(String str) {
System.out.println("hi," + str);
}
private String say(String str, char c) {
return str + "," + c;
}
private static void eat() {
System.out.println("eat");
}
}