502. Java 反射 - 编写 MessageInterceptor 类

502. Java 反射 - 编写 MessageInterceptor 类

1. 设计思路

拦截器的目标是:

  1. 在调用目标方法前 → 校验或修改参数。
  2. 调用目标方法 → 执行实际的业务逻辑。
  3. 在调用目标方法后 → 处理返回值或执行额外逻辑。

在这个例子中,我们希望拦截 SomeInterceptedService.message() 方法,并且:

  • 检查参数是否合法(非空、非空字符串)。
  • 调用原始方法,获取结果。
  • 在结果末尾加上 " [was intercepted]" 来表明它被拦截过。

2. MessageInterceptor 实现

public class MessageInterceptor implements Interceptor<SomeInterceptedService, String> {

    @Override
    public String intercept(
            SomeInterceptedService service, Method interceptedMethod, Object... arguments) {
        try {
            if (arguments.length == 1) {

                // ✅ 1. 参数校验
                String input = (String) arguments[0];
                Objects.requireNonNull(input, "Input is null");
                if (input.isEmpty()) {
                    throw new IllegalArgumentException("Input is empty");
                }

                // ✅ 2. 调用目标方法
                String result = (String) interceptedMethod.invoke(service, arguments);

                // ✅ 3. 修改返回值
                return result + " [was intercepted]";
            }
        } catch (IllegalAccessException | InvocationTargetException e) {
            throw new RuntimeException("Error invoking method reflectively", e);
        }

        throw new IllegalArgumentException(
                "Arguments should contain exactly one argument of type String");
    }
}

3. 示例讲解

原始服务类

public class SomeInterceptedService {
    @Intercept(MessageInterceptor.class)
    public String message(String input) {
        return input.toUpperCase();
    }
}

测试调用

public class Main {
    public static void main(String[] args) throws Exception {
        String output = (String) ServiceFactory.invoke(SomeInterceptedService.class, "message", "hello");
        System.out.println("Final output = " + output);
    }
}

输出结果

Final output = HELLO [was intercepted]

4. 总结

  • 参数校验:如果传入 null 或空字符串,会抛出异常,阻止目标方法的执行。
  • 拦截逻辑:我们在调用 message() 前后加入了额外逻辑(参数校验 + 结果追加说明)。
  • 反射调用:通过 interceptedMethod.invoke(service, arguments) 来执行实际的业务方法。
  • 增强返回值:返回值被拦截器修改,增加了 " [was intercepted]"
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容