看一下示例代码:
public class MethodTest1 {public static void main(String[] args) throws Exception{
Class c = Student.class;
// 获取public方法getScore,参数为String;
System.out.println(c.getMethod("getScore",String.class));
// 获取继承的public方法getName,无参数;
System.out.println(c.getMethod("getName"));
// 获取private方法getGrade,参数为int;
System.out.println(c.getDeclaredMethod("getGrade",int.class));
}
}
运行结果:
public int com.javastudy.reflection.Methods.Student.getScore(java.lang.String)public java.lang.String com.javastudy.reflection.Methods.Person.getName()
private int com.javastudy.reflection.Methods.Student.getGrade(int)
获取 Method 的信息
一个 Method 对象包含了一个方法的所有信息:
getName():返回方法名称,例如:「getScore」
getReturnType():返回方法的返回值类型,是一个 Class 实例,例如:「String.class」
getParameterTypes():返回方法的参数类型,是一个 Class 数组,例如:{String.class, int.class}
getModifiers():返回方法的修饰符,和 Field 的 getModifiers() 大同小异
示例如下:
public class MethodTest2 {public static void main(String[] args) throws Exception{
Class c = Student.class;
Method method= c.getDeclaredMethod("getGrade",int.class);
System.out.println("name : " + method.getName());
System.out.println("returnType : " + method.getReturnType());
Class<?>[] parameterTypes = method.getParameterTypes();
System.out.println("paramaterTypes的长度 : " + parameterTypes.length);
for (Class parameterType : parameterTypes){
System.out.println("paramaterTypes : " + parameterType);
}
}
}
运行结果:
name : getGradereturnType : int
paramaterTypes的长度 : 1
paramaterTypes : int
调用方法 调用普通方法
先看示例:
public class MethodTest3 {public static void main(String[] args) throws Exception {
String s = "不是秃头的小李程序员";
Method method = String.class.getMethod("substring", int.class);
Method method2 = String.class.getMethod("substring", int.class, int.class);
String result = (String) method.invoke(s,7);
String result2 = (String) method2.invoke(s,1,9);
System.out.println(result);
System.out.println(result2);
}
}
运行结果:
程序员
是秃头的小李程序
分析下程序员小李是如何秃头的:
通过 Class 实例的 getMethod 方法获取Method,getMethod 的 name 和参数不同,获取的 Method 也是不同的。
使用 Method 的 invoke 方法就相当于调用该方法。invoke 的第一个参数是对象实例,后面的可变参数与方法参数一致,否则将报错。
调用静态方法调用静态方法,无需指定实例对象,invoke 方法传入的第一个参数永远是 null 或者空值 ”“,我们看下面的例子:
public class MethodTest4 {public static void main(String[] args) throws Exception{
// 获取Integer.parseInt(Stirng)方法,参数是String
Method method = Integer.class.getMethod("parseInt", String.class);
// 调用静态方法获取结果
// Integer result = (Integer)method.invoke("", "12345");
Integer result = (Integer)method.invoke(null, "12345");
System.out.println(result);
}
}
运行结果:12345
调用非public方法