来自:
Java教程 - 廖雪峰的官方网站研究互联网产品和技术,提供原创中文精品教程
https://www.liaoxuefeng.com/wiki/1252599548343744
Class 类提供了以下几个方法来获取 Method:
Method getMethod(name, Class...):获取某个public的Method(包括父类)Method getDeclaredMethod(name, Class...):获取当前类的某个Method(不包括父类)Method[] getMethods():获取所有public的Method(包括父类)Method[] getDeclaredMethods():获取当前类的所有Method(不包括父类)
一个 Method对象包含一个方法的所有信息:
getName():返回方法名称,例如:"getScore";getReturnType():返回方法返回值类型,也是一个Class实例,例如:String.class;getParameterTypes():返回方法的参数类型,是一个Class数组,例如:{String.class, int.class};getModifiers():返回方法的修饰符,它是一个int,不同的bit表示不同的含义。
小结
Java的反射API提供的Method对象封装了方法的所有信息:
通过
Class实例的方法可以获取Method实例:getMethod(),getMethods(),getDeclaredMethod(),getDeclaredMethods();通过
Method实例可以获取方法信息:getName(),getReturnType(),getParameterTypes(),getModifiers();通过
Method实例可以调用某个对象的方法:Object invoke(Object instance, Object... parameters);通过设置
setAccessible(true)来访问非public方法;通过反射调用方法时,仍然遵循多态原则。
import java.lang.reflect.Method;
public class MethodTest {
public static void main(String[] args) throws Exception {
// String对象:
String s = "Hello world";
// 获取String substring(int)方法,参数为int:
Method m = String.class.getMethod("substring", int.class);
// 在s对象上调用该方法并获取结果:
String r = (String) m.invoke(s, 6);
// 打印调用结果:
System.out.println(r);
}
}
输出: world

import java.lang.reflect.Method;
public class MethodTest {
public static void main(String[] args) throws Exception {
// 获取Integer.parseInt(String)方法,参数为String:
Method m1 = Integer.class.getMethod("parseInt", String.class);
// 调用该静态方法并获取结果:
Integer n = (Integer) m1.invoke(null, "12345");//Method表示一个静态方法,调用静态方法时,由于无需指定实例对象,所以invoke方法传入的第一个参数永远为null
// 打印调用结果:
System.out.println(n);
Person p = new Person();
Method m = p.getClass().getDeclaredMethod("setName", String.class);
m.setAccessible(true);//某个SecurityManager可能不允许对java和javax开头的package的类调用setAccessible(true),这样可以保证JVM核心库的安全。
m.invoke(p, "Bob");
System.out.println(p.name);
}
}
class Person {
String name;
private void setName(String name) {
this.name = name;
}
}
//使用反射调用方法时,仍然遵循多态原则:即总是调用实际类型的覆写方法(如果存在)。
输出:
12345
Bob
本文详细介绍了Java反射API中Method类的使用方法,包括获取Method对象的四种方式以及Method对象提供的各种信息获取方法。通过示例展示了如何通过Method调用对象方法和静态方法,并强调了反射调用方法时遵循的多态原则。此外,还提到了通过setAccessible(true)来访问非public方法的安全性问题。
575

被折叠的 条评论
为什么被折叠?



