全部学科
Python全栈
python
NodeJS全栈
nodejs
小程序首页
📅 2026-05-11 6 分钟 ✍️ juanwangdev

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,需处理异常

要点总结

  1. getMethod() 获取公共方法,getDeclaredMethod() 获取所有方法
  2. 使用 method.invoke(obj, args...) 调用方法
  3. 私有方法需 setAccessible(true) 突破访问限制
  4. 静态方法调用时对象参数传 null
  5. 重载方法通过参数类型区分

📝 发现内容有误?点击此处直接编辑

← 上一篇 Java字段反射
下一篇 → Java构造器反射
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库