温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

怎样通过反射调用方法

发布时间:2026-10-25 07:49:03 来源:亿速云 阅读:94 作者:小樊 栏目:编程语言

在 Java 中,反射(Reflection)可以在运行时动态获取类的信息并调用其方法。下面从基本步骤、常见示例、注意事项三个方面说明。


一、通过反射调用方法的基本步骤

  1. 获取 Class 对象
  2. 获取 Method 对象
  3. 调用 Method.invoke()

二、示例讲解

1️⃣ 被调用的类

public class UserService {
    public void sayHello(String name) {
        System.out.println("Hello, " + name);
    }

    private int add(int a, int b) {
        return a + b;
    }
}

2️⃣ 调用 public 方法

import java.lang.reflect.Method;

public class Test {
    public static void main(String[] args) throws Exception {
        // 1. 获取 Class 对象
        Class<?> clazz = Class.forName("UserService");

        // 2. 创建实例
        Object obj = clazz.getDeclaredConstructor().newInstance();

        // 3. 获取 Method
        Method method = clazz.getMethod("sayHello", String.class);

        // 4. 调用方法
        method.invoke(obj, "Tom");
    }
}

✅ 输出:

Hello, Tom

3️⃣ 调用 private 方法

Method method = clazz.getDeclaredMethod("add", int.class, int.class);
method.setAccessible(true); // 关键:允许访问私有方法

Object result = method.invoke(obj, 3, 5);
System.out.println(result); // 8

4️⃣ 调用静态方法

public class MathUtil {
    public static int square(int x) {
        return x * x;
    }
}
Method method = MathUtil.class.getMethod("square", int.class);
Object result = method.invoke(null, 4); // 静态方法第一个参数为 null

三、常用 API 总结

方法 说明
Class.forName() 根据类名获取 Class
clazz.getMethod() 获取 public 方法
clazz.getDeclaredMethod() 可获取私有方法
method.invoke() 执行方法
setAccessible(true) 绕过访问控制

四、注意事项 ⚠️

  1. 性能较低:反射比直接调用慢
  2. 破坏封装:可访问 private 成员
  3. 安全检查:某些环境(如模块化、SecurityManager)会限制反射
  4. 异常处理:常见异常
    • NoSuchMethodException
    • IllegalAccessException
    • InvocationTargetException

五、典型使用场景

  • 框架(Spring、MyBatis)
  • 注解处理
  • 动态代理
  • 通用工具类

如果你指的是 其他语言(如 C# / Python) 或 特定场景(如调用构造方法、泛型方法),可以继续问我。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手