503. Java 反射 - 编写 ServiceFactory 类
文章目录503. Java 反射 - 编写 ServiceFactory 类1. 设计目标2. 核心实现代码3. 示例说明(1) 带拦截器的服务(2) 没有拦截器的服务(3) 测试调用(4) 运行结果4.总结503. Java 反射 - 编写 ServiceFactory 类1. 设计目标ServiceFactory的职责是统一拦截服务方法的调用它接收服务类、方法名、方法参数。自动创建服务实例。找到目标方法并判断是否带有Intercept注解。如果有注解 → 使用对应的拦截器来执行方法逻辑。如果没有注解 → 直接调用方法。这样我们就实现了一个简化版的拦截器机制。2. 核心实现代码publicclassServiceFactory{publicstaticT,RRinvoke(Class?extendsTserviceClass,StringmethodName,Object...arguments){try{// ✅ 1. 创建服务实例要求必须有无参构造器TserviceserviceClass.getConstructor().newInstance();// ✅ 2. 确定参数类型数组用于定位目标方法Class?[]parameterClassesArrays.stream(arguments).map(Object::getClass).toArray(Class?[]::new);MethodmethodserviceClass.getDeclaredMethod(methodName,parameterClasses);// ✅ 3. 判断方法上是否存在 Intercept 注解if(method.isAnnotationPresent(Intercept.class)){Interceptinterceptmethod.getDeclaredAnnotation(Intercept.class);// 获取拦截器类并实例化Class?extendsInterceptorT,RinterceptorClass(Class?extendsInterceptorT,R)intercept.value();InterceptorT,RinterceptorinterceptorClass.getConstructor().newInstance();// ✅ 4. 使用拦截器执行方法returninterceptor.intercept(service,method,arguments);}else{// ✅ 5. 没有注解 → 直接反射调用return(R)method.invoke(service,arguments);}}catch(InstantiationException|IllegalAccessException|InvocationTargetException|NoSuchMethodExceptione){thrownewRuntimeException(e);}}}3. 示例说明(1) 带拦截器的服务publicclassSomeInterceptedService{Intercept(MessageInterceptor.class)publicStringmessage(Stringinput){returninput.toUpperCase();}}(2) 没有拦截器的服务publicclassSomeNonInterceptedService{publicStringmessage(Stringinput){returninput.toUpperCase();}}(3) 测试调用publicclassMain{publicstaticvoidmain(String[]args){StringinterceptedOutputServiceFactory.invoke(SomeInterceptedService.class,message,Hello);System.out.println(Intercepted output interceptedOutput);StringnonInterceptedOutputServiceFactory.invoke(SomeNonInterceptedService.class,message,Hello);System.out.println(Non intercepted output nonInterceptedOutput);}}(4) 运行结果InterceptedoutputHELLO[was intercepted]Nonintercepted outputHELLO4.总结统一入口不管有没有拦截器ServiceFactory.invoke()都能完成方法调用。灵活扩展不同方法可以使用不同的拦截器比如日志拦截器、权限拦截器、缓存拦截器。类型不安全由于反射和强制类型转换编译期无法保证安全性 → 运行时可能抛出异常。对比实际框架Spring AOP、Jakarta EE Interceptor 都是基于类似的理念只不过使用了更底层的代理机制和字节码增强。