我是靠谱客的博主 单身酒窝,最近开发中收集的这篇文章主要介绍java 使用参数替换工具类获取注解入参中的参数,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

import cn.hutool.core.util.StrUtil;
import lombok.SneakyThrows;

import java.lang.reflect.Field;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 参数替换工具类
 */
public class ParamReplaceUtil {

    public static final Pattern pattern = Pattern.compile("<(.*?)>");

    /**
     * 将<>参数里面的内容全部替换成param的参数
     *
     * @param original 原始字符串
     * @param param    参数
     * @return 替换后的数据
     */
    public static String replace(String original, Map<String, String> param) {
        if (StrUtil.isEmpty(original)) {
            return original;
        }
        Matcher matcher = pattern.matcher(original);
        while (matcher.find()) {
            if (param.containsKey(matcher.group(1))) {
                original = original.replaceAll("<" + matcher.group(1) + ">", param.get(matcher.group(1)));
            }
        }
        return original;
    }

    /**
     * <user.name>
     * 替换单表达式类型
     *
     * @param original 原表达式
     * @param params   参数
     * @return 替换后的类型
     */
    @SneakyThrows
    public static Object replaceSingle(String original, Object[] params) {
        if (StrUtil.isEmpty(original)) {
            return original;
        }
        Matcher matcher = pattern.matcher(original);
        if (matcher.find()) {
            String el = matcher.group(1);
            String className = el.split("\.")[0];
            String filedName = el.split("\.")[1];

            for (Object o : params) {
                Class<?> clazz = o.getClass();
                if (clazz.getSimpleName().equals(captureName(className))) {
                    Field field = null;
                    try {
                        field = clazz.getDeclaredField(filedName);
                    } catch (NoSuchFieldException e) {
                        field=clazz.getSuperclass().getDeclaredField(filedName);
                    }
                    field.setAccessible(true);
                    return field.get(o);
                }
            }
        }
        return original;
    }

     /**
     * <user.name>,哈哈哈<user.id>
     * 替换多表达式字符串
     * @param original 原始字符串
     * @param params 参数
     * @return 替换后的字符串
     */
    @SneakyThrows
    public static String replaceMultiple(String original, Object[] params){
        if (StrUtil.isEmpty(original)) {
            return original;
        }
        Matcher matcher = pattern.matcher(original);
        while (matcher.find()) {

            String el = matcher.group(1);
            String className = el.split("\.")[0];
            String filedName = el.split("\.")[1];

            for (Object o : params) {
                Class<?> clazz = o.getClass();
                if (clazz.getSimpleName().equals(captureName(className))) {
                    Field field = null;
                    try {
                        field = clazz.getDeclaredField(filedName);
                    } catch (NoSuchFieldException e) {
                        field=clazz.getSuperclass().getDeclaredField(filedName);
                    }
                    field.setAccessible(true);
                    original=original.replaceAll("<" + matcher.group(1) + ">",ObjectUtil.toString(field.get(o)) );;
                }
            }
        }
        return original;
    }

    /**
     * 将字符串的首字母转大写
     *
     * @param str 需要转换的字符串
     * @return
     */
    public static String captureName(String str) {
        // 进行字母的ascii编码前移,效率要高于截取字符串进行转换的操作
        char[] cs = str.toCharArray();
        cs[0] -= 32;
        return String.valueOf(cs);
    }


}

2、具体注解中的使用

    @PostMapping("/test1")
    @ApiOperation("测试1")
    @OperationLogAnno(operatePage="<user.id>",operateType="984894",bizType="98979894")
    public String list1(@RequestBody User user){
        log.info("用户信息:"+ JSONUtil.toJsonStr(user));
        return "sss";
    }

3、切面中的用法

        Object[] params = joinPoint.getArgs();

        // 获取方法上声明的注解
        OperationLogAnno anno = objMethod.getDeclaredAnnotation(OperationLogAnno.class);

        log.info("operatePage:{}", ParamReplaceUtil.replaceSingle(anno.operatePage(),params));

        log.info("operateType:{}",ParamReplaceUtil.replaceMultiple(anno.operateType(), params));

最后

以上就是单身酒窝为你收集整理的java 使用参数替换工具类获取注解入参中的参数的全部内容,希望文章能够帮你解决java 使用参数替换工具类获取注解入参中的参数所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(132)

评论列表共有 0 条评论

立即
投稿
返回
顶部