Java方法反射
通过反射获取和调用方法,实现动态方法调用。
获取方法
获取公共方法
Java
Class<?> clazz = Person.class;
// 获取所有公共方法(包括继承的)
Method[] publicMethods = clazz.getMethods();
// 获取指定名称和参数类型的公共方法
Method method = clazz.getMethod("setName", String.class);
获取所有方法(包括私有)
Java
// 获取本类声明的所有方法(不含继承)
Method[] declaredMethods = clazz.getDeclaredMethods();
// 获取指定名称的方法(包括私有)
Method privateMethod = clazz.getDeclaredMethod("privateMethod", String.class);
调用方法
invoke()方法
Java
Method method = clazz.getMethod("setName", String.class);
Object result = method.invoke(obj, "张三"); // obj是方法所属对象
调用示例
Java
public class Person {
private String name;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
private void privateMethod(String msg) {
System.out.println("私有方法: " + msg);
}
public static void staticMethod() {
System.out.println("静态方法");
}
}
// 反射调用
Class<?> clazz = Person.class;
Person person = new Person();
// 调用公共方法
Method setName = clazz.getMethod("setName", String.class);
setName.invoke(person, "李四");
Method getName = clazz.getMethod("getName");
String name = (String) getName.invoke(person);
// 调用私有方法
Method privateMethod = clazz.getDeclaredMethod("privateMethod", String.class);
privateMethod.setAccessible(true);
privateMethod.invoke(person, "Hello");
// 调用静态方法(obj传null)
Method staticMethod = clazz.getMethod("staticMethod");
staticMethod.invoke(null);
Method常用方法
Java
Method method = clazz.getMethod("setName", String.class);
// 方法信息
String name = method.getName(); // 方法名
int modifiers = method.getModifiers(); // 修饰符
Class<?> returnType = method.getReturnType(); // 返回类型
Class<?>[] paramTypes = method.getParameterTypes(); // 参数类型
int paramCount = method.getParameterCount(); // 参数个数
// 异常信息
Class<?>[] exceptionTypes = method.getExceptionTypes();
// 参数详情(Java 8+)
Parameter[] params = method.getParameters();
// 调用方法
Object result = method.invoke(obj, args...);
方法重载处理
Java
public class Calculator {
public int add(int a, int b) { return a + b; }
public double add(double a, double b) { return a + b; }
public String add(String a, String b) { return a + b; }
}
// 根据参数类型区分重载方法
Class<?> clazz = Calculator.class;
Calculator calc = new Calculator();
Method addInt = clazz.getMethod("add", int.class, int.class);
int result1 = (int) addInt.invoke(calc, 1, 2);
Method addDouble = clazz.getMethod("add", double.class, double.class);
double result2 = (double) addDouble.invoke(calc, 1.5, 2.5);
Method addString = clazz.getMethod("add", String.class, String.class);
String result3 = (String) addString.invoke(calc, "Hello", "World");
getMethods与getDeclaredMethods区别
| 方法 | 范围 | 访问权限 | 继承方法 |
|---|---|---|---|
| getMethods() | 本类+父类+接口 | 仅public | 包含 |
| getDeclaredMethods() | 仅本类 | 所有 | 不含 |
注意事项
私有方法需要 setAccessible(true) 才能调用
静态方法调用时,invoke() 的第一个参数传 null
invoke() 返回 Object 类型,需要根据返回类型强转
方法不存在时抛出 NoSuchMethodException,需处理异常
要点总结
- getMethod() 获取公共方法,getDeclaredMethod() 获取所有方法
- 使用 method.invoke(obj, args...) 调用方法
- 私有方法需 setAccessible(true) 突破访问限制
- 静态方法调用时对象参数传 null
- 重载方法通过参数类型区分
📝 发现内容有误?点击此处直接编辑