You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
test/src-源文件/main/java/com/yf/exam/aspect/utils/InjectUtils.java

128 lines
6.8 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

// 定义包路径用于存放注入工具类相关的代码。这个包名表明该类属于特定的项目模块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异常这里只是简单地捕获异常
// 可以根据实际需求进一步处理异常,比如记录更详细的日志信息等。
}
}
}