首先呢 还是先创建一个测试类,包括有参和无参构造器,注解,公开和私有的方法
@Reference
public class FanSheTest {
public String run(String food){
System.out.println("我正在跑:"+food);
return "执行了";
}
public FanSheTest() {
}
public FanSheTest(String name) {
}
public String run(){
return "跑错了";
}
private int study(int age){
System.out.println( "战鹰"+age+"岁了");
return 0;
}
}
获取所有public的方法,该方法会返回其父类的方法
/**获取类的public方法*/
Class<?> clazz = Class.forName("测试.FanSheTest");
Method[] methods = clazz.getMethods();
for (Method method : methods) {
System.out.println(method);
}
获取私有的方法,可以获取到private方法,不能够获取父类的方法
/**获取类的所有方法*/
Method[] declaredMethods = clazz.getDeclaredMethods();
for (Method declaredMethod : declaredMethods) {
System.out.println(declaredMethod);
}
获取单个public方法的信息
需要注意的是,应该带上方法的参数,就比如我的类里面有两个run方法,那么就应该通过参数来区分调用的是哪个方法
Method clazzMethod = clazz.getMethod("run");
System.out.println(clazzMethod);
Method clazzMethod1 = clazz.getMethod("run", String.class);
System.out.println(clazzMethod1);
获取private属性的方法
Method age = clazz.getDeclaredMethod("study", int.class);
对获取的方法进行操作
要想操作方法,就必须要创建实例,也就是对象,我们采用反射的形式创建对象实例
如果是操作私有的方法,就需要加上setAccessible方法进行设置权限
Constructor<?> constructor = clazz.getConstructor(String.class);
FanSheTest fanSheTest = (FanSheTest) constructor.newInstance("张三");
age.setAccessible(true);
int invoke = (int) age.invoke(fanSheTest, 1);
操作public修饰的方法
- 使用
clazz.getConstructor()
获取类的无参构造方法。 - 使用该构造方法创建一个对象,例如
Object obj = constructor1.newInstance();
。 - 使用
clazz.getMethod("run", String.class)
获取名为 “run” 的方法,参数类型为String
。 - 调用
invoke()
方法,将创建的对象作为第一个参数传入,例如Object result = run.invoke(obj, "a");
。
Constructor<?> constructor1 = clazz.getConstructor();
Object fanshe = constructor1.newInstance();
Method run = clazz.getMethod("run", String.class);
Object invoke1 = run.invoke(fanshe, "a");
System.out.println(invoke1);