通过反射获取类的成员方法
Class类中与Method相关的方法
- Method getDeclaredMethod(String name,Class… args);----->推荐
- 根据方法名和参数类型获得对应的构造方法对象,包括public、protected、(默认)、private的
参数1:要获取的方法的方法名
参数2:要获取的方法的形参类型的Class对象
- 根据方法名和参数类型获得对应的构造方法对象,包括public、protected、(默认)、private的
- Method[] getDeclaredMethods();----->推荐
- 获得类中的所有成员方法对象,返回数组,只获得本类的,包括public、protected、(默认)、private的
通过反射执行成员方法
Method对象常用方法
-
Object invoke(Object obj, Object… args)
参数1:调用该方法的对象
参数2:调用该法时传递的实际参数
返回值:该方法执行完毕后的返回值 -
void setAccessible(true)
设置"暴力访问"——是否取消权限检查,true取消权限检查,false表示不取消
示例代码
package com;
/**
* @Author: Mr.Xu
* @description: 反射
* @Date: 2021/10/8 14:31
*/
public class Test_02 {
public void show1() {
System.out.println("show1...");
}
public void show2(String name) {
System.out.println("show2" + name);
}
public String show3(String name, int age) {
System.out.println("show3" + name + age);
return name;
}
private int show4(int age, String name) {
System.out.println("show4" + age + name);
return age;
}
private void show5() {
System.out.println("show5");
}
}
测试类
package com;
import java.lang.reflect.Method;
/**
* @Author: Mr.Xu
* @description: 反射练习
* @Date: 2021/10/8 9:38
*/
public class Test {
public static void main(String[] args) throws Exception {
//获取字节码文件
Class<Test_02> t = Test_02.class;
//通过反射获取方法
Method s1 = t.getDeclaredMethod("show1");
System.out.println(s1);
Method s2 = t.getDeclaredMethod("show2", String.class);
System.out.println(s2);
Method s3 = t.getDeclaredMethod("show3", String.class, int.class);
System.out.println(s3);
Method s4 = t.getDeclaredMethod("show4", int.class, String.class);
System.out.println(s4);
Method s5 = t.getDeclaredMethod("show5");
System.out.println(s5);
System.out.println("---------------------------------");
//获取类的实例对象
//如果没有实例对象会报 IllegalArgumentException不合法的参数异常
Test_02 tt = t.getDeclaredConstructor().newInstance();
//执行方法
s1.invoke(tt);
s2.invoke(tt,"张三");
s3.invoke(tt,"张三",10);
//关闭权限检查,否则会报 IllegalArgumentException不合法的参数异常
//因为s4是私有的
s4.setAccessible(true);
s4.invoke(tt,10 , "李四");
//关闭权限检查,否则会报 IllegalArgumentException不合法的参数异常
//因为s5是私有的
s5.setAccessible(true);
s5.invoke(tt);
}
}
小白一枚,喜欢编程,以上内容纯手打,如有错误,请指正!!!
谢谢观看!欢迎下次再来ヾ(≧▽≦*)o