学习反射5(获取成员方法)
目录
前言
成员方法
Class类中用于获取成员方法的方法
实例【获取全部方法或指定方法】
获取成员方法的参数个数和参数类型
获取成员方法的抛出的异常
获取成员方法的方法名
Method类中用于调用的方法
前言
上一篇博客介绍了 获取成员变量 CSDN 本篇博客介绍如何 获取成员方法以及成员方法中的参数等
成员方法
成员方法也和成员变量一样 ,每一个方法都封装成Method 类 对象
Class类中用于获取成员方法的方法
Method[]getMethods() | 返回所有公共成员方法对象的数组,包括继承的 |
Method[]getDeclaredMethods() | 返回所有成员方法对象的数组,不包括继承的 |
Method getMethod(String name, Class<?>...parameterypes) | 返回单个公共成员方法对象 |
Method getDeclaredMethod(String name, Class<?>.. parameterrypes) | 返回单个成员方法对象 |
实例【获取全部方法或指定方法】
现在有一个 Student 类 在基本的方法之前 还新增了 方法 :sleep() 和 eat() 方法
public void sleep(){ System.out.println("我爱睡觉"); } private void study(){ System.out.println("我爱学习"); } private void study(String thing){ System.out.println("我爱学习"+thing); }
- 获取类中的所有公共方法 包括继承的父类的公共方法
步骤
1 创建 Class 类 对象
2 调用Class 类下的 getMethods()或 getDeclaredMethods()方法
// 创建 Class 类对象 Class<?> aClass = Class.forName("fs.exerise02.Student"); // 获取Student 类中的所有的方法 包括 继承的 父类的公共方法 Method[] methods = aClass.getMethods(); for (Method method : methods) { System.out.println(method.getName()); }
运行结果
- 获取 类中 所有方法
需要修改的代码如下
Method[] methods = aClass.getDeclaredMethods();
运行结果
发现
打印的是子类的所有方法,无法获得 父类的所有方法
总结
1 加了 Declared 可以获得 目标类中的所有权限修饰的方法 或指定方法,如果不加只能获得公共的方法
2 加了 Declared 无法获得 继承的父类中的所有方法 ,但是 不加可以获得继承父类的所有公共方法
获取指定方法
步骤
1 创建 Class 类 对象
2 调用Class 类下的 getMethod()或 getDeclaredMethod()方法
要求 : 获取 带参数的study 方法
Class<?> aClass = Class.forName("fs.exerise02.Student"); // 获取Student 类中的指定的方法 Method method = aClass.getMethod("study", String.class); System.out.println(method);
运行结果
发现报错了,原因是 study 方法是被 private 修饰的,无法直接获得。需要使用getDeclaredMethod()方法
// 获取Student 类中的指定的方法 Method method = aClass.getDeclaredMethod("study", String.class);
运行结果
获取成员方法的参数个数和参数类型
// 创建 Class 类对象
Class<?> aClass = Class.forName("fs.exerise02.Student");
// 获取Student 类中的指定的方法
Method method = aClass.getDeclaredMethod("study", String.class);
// 获取方法的参数个数和参数类型
int parameterCount = method.getParameterCount();
System.out.println(parameterCount);
Class<?>[] parameterTypes = method.getParameterTypes();
for (Class<?> parameterType : parameterTypes) {
System.out.println(parameterType);
}
获取成员方法的抛出的异常
我现在向 带参的study 方法添加几个异常
private void study(String thing) throws NullPointerException, ClassNotFoundException{ System.out.println("我爱学习"+thing); }
Test 测试类中 代码如下
// 创建 Class 类对象 Class<?> aClass = Class.forName("fs.exerise02.Student"); // 获取Student 类中的指定的方法 抛出的异常 Method method = aClass.getDeclaredMethod("study", String.class); Class<?>[] exceptionTypes = method.getExceptionTypes(); for (Class<?> exceptionType : exceptionTypes) { System.out.println(exceptionType.getName()); }
运行结果
获取成员方法的方法名
- 调用 getName()方法 获得 对应的方法名
Method类中用于调用的方法
Object invoke(Object obj, Object...args) 运行方法 注意
参数一:用obj对象调用该方法
参数二:调用方法的传递的参数(如果没有就不写)
返回值:方法的返回值(如果没有就不写)实例
调用 带参的study 方法
// 创建 Class 类对象 Class<?> aClass = Class.forName("fs.exerise02.Student"); // 获取Student 类中的指定的方法 抛出的异常 Method method = aClass.getDeclaredMethod("study", String.class); method.setAccessible(true); // Student 对象 Student student = (Student) aClass.newInstance(); method.invoke(student, "java");
运行结果
发现
为什么调用 setAccessible(true) 方法?
该方法被private 权限修饰符修饰 ,无法直接 调用
invoke()方法的第一个参数 目标类的对象,第二参数 是需要传递的可变参数。可以是一个或多个。