【反射】获取类中的成员方法并执行

1.Class类获取成员方法对象:

方法分类

Method[] getMethods():返回所有公共成员方法对象的数组,包括继承的

Method[] getDeclaredMethods():返回所有成员方法对象的数组,不包括继承的

Method getMethod(String methodName, Class...parameterTypes):返回单个公共成 员方法对象

Method getDeclaredMethod(String methodName, Class...parameterTypes):返回单 个成员方法对象

2.Method类型:

1)表示成员方法的类型,该类型的每个对象,都是一个具体的成员方法

2)成员方法对象具有的功能: 获取成员方法信息,比如:注解,名称,返回值类型,参数类型等等, 及运行方法.

3.Method类用于执行方法的功能:

//参数1: 要执行是那个对象的该方法 p.eat(), 参数1就是p

//参数2: 执行方法是需要的实参,都是Object类型, 基本类型自动装箱

// 返回值类型: Object 表示方法执行完之后的返回值 返回值是基本类的,会自动装箱 Object invoke(Object obj, Object...values):调用obj对象的成员方法,参数是 values,返回值是Object类型.

// 反射获取成员方法对象
public class GetMethod {
public static void main(String[] args) throws Exception{
// 获取类对象
Class c1 = Class.forName("com.ujiuye.demo01.Person");
// 获取public修饰的方法,既能获取到自己类中声明公开的方法,也能获取到父类中声明的
公开方法
Method[] ms1 = c1.getMethods();
for (Method method : ms1) {
System.out.println(method);
}
System.out.println("-----------------------------------------");
// 获取所有的方法, 获取到自己类中声明的方法,父类继承的拿不到
Method[] ms2 = c1.getDeclaredMethods();
for (Method method : ms2) {
System.out.println(method);
}
System.out.println("=======================================");
// 创建一个该类的对象
Constructor con = c1.getConstructor();
Object o = con.newInstance();
// 获取某一个public修饰的方法对象
// 参数1: 获取方法对象的方法名
// 参数2: 方法中声明参数的类型的类对象
// getMethod(String methodName, Class...type);
// public void eat()
Method m1 = c1.getMethod("eat");
System.out.println(m1);
暴力反射
代码示例
// 执行方法m1
Object r1 = m1.invoke(o); // o.eat()
System.out.println(r1);
// public void eat(String name)
Method m2 = c1.getMethod("eat", String.class);
System.out.println(m2);
// 执行方法m1
m2.invoke(o, "翔"); // o.eat("翔")
// public int sum(int a, int b)
Method m3 = c1.getMethod("sum", int.class, int.class);
System.out.println(m3);
// 执行方法m3
Object r3 = m3.invoke(o, 10, 20);
System.out.println(r3);
System.out.println(r3.getClass());
// private double sum(double a, double b)
// 获取本类中任何一个方法对象
// getDeclaredMethod(String methodName. Class...type)
Method m4 = c1.getDeclaredMethod("sum", double.class, double.class);
System.out.println(m4);
Method m5 = c1.getDeclaredMethod("buy");
System.out.println(m5);
// 执行方法m4
Object r5 = m5.invoke(o); // o.buy()
System.out.println(r5);
}
}

上一篇:Java学习笔记(更新ing)


下一篇:常用的Dos命令