502. Java 反射 - 编写 MessageInterceptor 类

文章目录

  • [502. Java 反射 - 编写 MessageInterceptor 类](#502. Java 反射 - 编写 MessageInterceptor 类)
    • [1. 设计思路](#1. 设计思路)
    • [2. MessageInterceptor 实现](#2. MessageInterceptor 实现)
    • [3. 示例讲解](#3. 示例讲解)
    • [4. 总结](#4. 总结)

502. Java 反射 - 编写 MessageInterceptor 类

1. 设计思路

拦截器的目标是:

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

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

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

2. MessageInterceptor 实现

java 复制代码
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. 示例讲解

原始服务类

java 复制代码
public class SomeInterceptedService {
    @Intercept(MessageInterceptor.class)
    public String message(String input) {
        return input.toUpperCase();
    }
}

测试调用

java 复制代码
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);
    }
}

输出结果

java 复制代码
Final output = HELLO [was intercepted]

4. 总结

  • 参数校验 :如果传入 null 或空字符串,会抛出异常,阻止目标方法的执行。
  • 拦截逻辑 :我们在调用 message() 前后加入了额外逻辑(参数校验 + 结果追加说明)。
  • 反射调用 :通过 interceptedMethod.invoke(service, arguments) 来执行实际的业务方法。
  • 增强返回值 :返回值被拦截器修改,增加了 " [was intercepted]"。
相关推荐
夏幻灵6 小时前
JavaScript this 面试:五种绑定规则、优先级与常见面试陷阱
开发语言·javascript·面试
程序猿编码6 小时前
榨干 RTX5090 算力!Qwen3 专用单卡推理引擎,手写C++/CUDA 算子实现 MTP 推测解码
开发语言·c++·大模型推理·qwen3·多模态推理
bkspiderx8 小时前
Qt 插件机制:动态扩展应用功能的核心框架
开发语言·qt·元数据·qt 插件·qpluginloader
代码什么用8 小时前
Spring基础使用
java·后端·spring
程序员老陆8 小时前
深入理解 C++ thread_local:线程私有存储的正确打开方式
开发语言·c++·程序设计
沐晓时光8 小时前
C语言入门,深入理解指针(3)
c语言·开发语言
Su米苏8 小时前
Spring AI 中MCP 与普通 @Tool的区别
java·人工智能·spring
码云数智-园园8 小时前
unique_ptr 还是 shared_ptr?C++ 智能指针选型与内存泄漏实战分析
java·开发语言
老板一杯拿铁8 小时前
Java 异常体系详解:从字节码原理到最佳实践
java
蜗牛互联网9 小时前
Java 17 HttpClient调用文件转写API的超时与失败回退
java·人工智能·后端