/**
   * 获取指定选项组名称替换model的选项字段值对应的展示值 [基于get/set方法]
   *
   * @param model
   * @param optName 选项组名称
   * @param getName 字段get方法
   * @param setName 字段set方法
   */
  public <T> void replaceOptionValue(T model, String optName, String getName, String setName) {

    try {

      Method getMethod = model.getClass().getMethod(getName);
      // 从选项字典查询出指定字典名称, 指定选项值的选项显示名称

      String optionValue = getOptionValue(optName, getMethod.invoke(model).toString());

      // 如果不是空(也就是根据当前字段值为key, 没找到选项字典对应value), 才替换, 上一次替换将缓存中的user的status已经替换成optionValue, 比如1 :
      // 启用, 如果缓存还生效, 这次user中的status已经是字符: '启用', 所以会找不到
      if (SysUtil.isNotEmpty(optionValue)) {
        Method setMethod = model.getClass().getMethod(setName, String.class);
        setMethod.invoke(model, optionValue);
      }

    } catch (Exception e) {
      throw new RuntimeException(e);
    }
  }
  /**
   * 获取指定选项组名称替换model的选项字段值对应的展示值 [基于反射]
   *
   * @param model
   * @param optName 选项组名称
   * @param fieldName 字段名
   */
  public <T> void replaceOptionValue(T model, String optName, String fieldName) {

    try {

      Field field = model.getClass().getDeclaredField(fieldName);
      field.setAccessible(true);

      // 根据选项组名称和字段反射出的选项key查询选项value
      String optionValue = getOptionValue(optName, (String) field.get(model));

      // 如果不是空(也就是根据当前字段值为key, 没找到选项字典对应value), 才替换, 上一次替换将缓存中的user的status已经替换成optionValue, 比如1 :
      // 启用, 如果缓存还生效, 这次user中的status已经是字符: '启用', 所以会找不到
      if (SysUtil.isNotEmpty(optionValue)) {
        field.set(model, optionValue);
      }

    } catch (Exception e) {
      throw new RuntimeException(e);
    }
  }