zyy
2025-12-23 e0c284c3f848e6e528d2f6e63c4da1148471048a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
package com.yami.trading.common.util;
 
import org.apache.commons.lang3.StringUtils;
 
/**
 * 字符串转义工具类
 */
public class StringEscapeUtil {
 
    /**
     * 将字符串中的 & 转义为 &
     * @param str 原始字符串
     * @return 转义后的字符串(null/空字符串直接返回)
     */
    public static String escapeAmpersand(String str) {
        if (StringUtils.isBlank(str)) {
            return str;
        }
        return str.replace("&", "&");
    }
 
    public static String unEscapeAmpersand(String str) {
        if (StringUtils.isBlank(str)) {
            return str;
        }
        return str.replace("&", "&");
    }
 
    /**
     * 递归处理实体中所有字符串类型字段的 & 转义
     * @param obj 要处理的实体对象
     */
    public static void escapeEntityAmpersand(Object obj) {
        if (obj == null) {
            return;
        }
 
        // 获取实体所有字段
        java.lang.reflect.Field[] fields = obj.getClass().getDeclaredFields();
        for (java.lang.reflect.Field field : fields) {
            try {
                // 设置可访问私有字段
                field.setAccessible(true);
                Object value = field.get(obj);
 
                // 只处理字符串类型字段
                if (value instanceof String) {
                    String escapedValue = escapeAmpersand((String) value);
                    field.set(obj, escapedValue);
                }
            } catch (IllegalAccessException e) {
                // 捕获字段访问异常,不中断流程
                e.printStackTrace();
            }
        }
    }
}