// 定义包路径,用于存放注入工具类相关的代码。这个包名表明该类属于特定的项目模块(com.yf.exam)下的aspect.utils部分, // 通常用于组织和管理与注入操作相关的工具类代码。 package com.yf.exam.aspect.utils; // 导入FastJSON库,它是一个用于将Java对象与JSON字符串进行相互转换的高性能库, // 在本类的restError方法中用于将API响应对象转换为JSON字符串以便写入HTTP响应中。 import com.alibaba.fastjson.JSON; // 导入API错误类,它可能定义了一系列表示不同类型API错误的常量或属性, // 在本类的restError方法中用于创建包含特定错误信息的API响应对象。 import com.yf.exam.core.api.ApiError; // 导入API响应类,它用于封装API调用的返回结果,包括成功的结果以及可能出现的错误信息等, // 在本类的restError方法中用于创建要返回给客户端的错误响应对象。 import com.yf.exam.core.api.ApiRest; // 导入Lombok的Log4j2注解,用于简化日志记录的配置,通过该注解可以方便地在类中使用Log4j2进行日志输出。 import lombok.extern.log4j.Log4j2; // 导入Spring框架的组件注解,用于标记该类是一个Spring组件,这样Spring容器可以对其进行管理和实例化, // 使其能够在Spring应用程序中被其他组件所使用。 import org.springframework.stereotype.Component; // 导入Java标准库中的HTTP响应类,用于处理HTTP协议相关的响应操作, // 在本类的restError方法中用于设置响应的编码、内容类型以及写入响应内容等操作。 import javax.servlet.http.HttpServletResponse; // 导入Java标准库中的IO异常类,用于处理输入输出操作过程中可能出现的异常情况, // 在本类的restError方法以及其他可能涉及到IO操作的地方用于捕获和处理相关异常。 import java.io.IOException; // 导入Java标准库中的反射字段类,用于通过反射操作对象的私有字段, // 在本类的setValue和getFiled方法中用于获取和设置对象的指定字段的值。 import java.lang.reflect.Field; /** * 注入工具类,提供了一些用于对象字段赋值以及处理错误响应返回等功能的方法。 * @author bool * @date 2019-07-17 09:32 */ @Log4j2 // 使用Log4j2注解启用日志记录功能,方便在类中记录相关操作的日志信息。 @Component // 将该类标记为Spring组件,使其能够被Spring容器管理和使用。 public class InjectUtils { /** * 给指定对象的指定字段赋值的方法。 * * @param object 要进行赋值操作的对象。 * @param value 要赋给指定字段的值。 * @param fields 一个可变参数,用于指定要赋值的字段名数组。 * @throws Exception 如果在获取字段或设置字段值的过程中出现异常,则抛出。 */ public void setValue(Object object, Object value, String... fields) throws Exception { // 遍历要赋值的字段名数组 for (String fieldName : fields) { // 根据对象的类和字段名获取对应的字段对象 Field field = this.getFiled(object.getClass(), fieldName); // 如果获取到的字段对象为空,说明未找到对应的字段,继续下一个字段的处理。 if (field == null) { continue; } // 通过反射设置该字段可访问,因为私有字段默认是不可直接访问的。 field.setAccessible(true); // 使用反射设置该字段的值为传入的值,即将指定的值赋给对象的指定字段。 field.set(object, value); } } /** * 根据目标类和字段名获取对应的字段对象的方法。 * * @param clazz 目标类,即要在其中查找字段的类。 * @param fieldName 要查找的字段名。 * @return 返回找到的字段对象,如果未找到则返回null。 */ private Field getFiled(Class clazz, String fieldName) { System.out.println("注入的类:" + clazz.toString()); // 打印当前正在查找字段的目标类的信息,方便调试查看。 // 尝试获取当前类中指定字段名的字段对象 try { return clazz.getDeclaredField(fieldName); } catch (Exception e) { log.error(clazz.toString() + ": not exist field, try superclass " + fieldName); // 如果获取字段失败,记录错误日志, // 提示在当前类中不存在指定字段, // 并准备尝试在父类中查找。 // 如果当前类未找到指定字段且存在父类,则递归调用本方法在父类中继续查找指定字段。 if (clazz.getSuperclass()!= null) { return this.getFiled(clazz.getSuperclass(), fieldName); } // 如果在当前类及其所有父类中都未找到指定字段,则返回null。 return null; } } /** * 用于处理错误情况并将错误结果返回给客户端的方法,通过设置HTTP响应的相关属性和写入错误响应内容来实现。 * * @param response HTTP响应对象,用于向客户端发送响应信息。 * @throws IOException 如果在设置响应属性或写入响应内容过程中出现IO异常,则抛出。 */ public static void restError(HttpServletResponse response) { try { // 创建一个包含特定API错误信息的API响应对象,这里使用了ApiError.ERROR_10010002作为错误码, // 具体含义可能在ApiError类中定义,通常表示某种常见的错误情况。 ApiRest apiRest = new ApiRest(ApiError.ERROR_10010002); // 设置HTTP响应的字符编码为UTF-8,确保能够正确处理和传输各种字符,特别是中文等非ASCII字符。 response.setCharacterEncoding("UTF-8"); // 设置HTTP响应的内容类型为application/json,表明返回给客户端的内容是JSON格式的数据。 response.setContentType("application/json"); // 将创建的API响应对象转换为JSON字符串,并写入到HTTP响应的输出流中,以便客户端能够接收到错误信息。 response.getWriter().write(JSON.toJSONString(apiRest)); // 关闭HTTP响应的写入流,释放相关资源。 response.getWriter().close(); } catch (IOException e) { // 如果在设置响应属性或写入响应内容过程中出现IO异常,这里只是简单地捕获异常, // 可以根据实际需求进一步处理异常,比如记录更详细的日志信息等。 } } }