Java工具函数-替换特殊字符间实体类属性的值

        记录一下工作中遇到的模版替换经历,在这次工作中遇到需要进行消息模版的内容替换。我选择在消息模版待替换位置用特殊字符包裹实体类中的属性名,然后替换则是通过反射将值替换到字符串中。事不宜迟,上代码!!!

  • 工具类函数代码
    /**
     * @description (startStr.*?endStr)是懒惰匹配,只会匹配符合条件的最短字符串
     * @param originStr 原始字符串
     * @param startStr 起始字符
     * @param endStr 终止字符
     * @param isNeedEscape 是否需要转义
     * @return java.util.LinkedList<java.lang.String>
     * @author elonjohnson
     * @date 2023/3/16 09:51:33
     */
    public static LinkedList<String> getStrContainData(String originStr, String startStr, String endStr, boolean isNeedEscape) {
        LinkedList<String> strList = new LinkedList<>();
        if(isNeedEscape) {
            startStr = "\\" + startStr;
            endStr = "\\" + endStr;
        }
        String charRegex = "(" + startStr + ".*?" + endStr + ")";
        Pattern pattern = Pattern.compile(charRegex);
        Matcher matcher = pattern.matcher(originStr);
        while(matcher.find()){
            String content = matcher.group(1);
            content = content.replaceAll(startStr, "").replaceAll(endStr, "");
            strList.add(content);
        }
        return strList;
    }
  • 反射关键代码
    /**
     * 调用Getter方法.
     * 支持多级,如:对象名.对象名.方法
     */
    @SuppressWarnings("unchecked")
    public static <E> E invokeGetter(Object obj, String propertyName)
    {
        Object object = obj;
        for (String name : StringUtils.split(propertyName, "."))
        {
            String getterMethodName = GETTER_PREFIX + StringUtils.capitalize(name);
            object = invokeMethod(object, getterMethodName, new Class[] {}, new Object[] {});
        }
        return (E) object;
    }

    /**
     * 直接调用对象方法, 无视private/protected修饰符.
     * 用于一次性调用的情况,否则应使用getAccessibleMethod()函数获得Method后反复调用.
     * 同时匹配方法名+参数类型,
     */
    @SuppressWarnings("unchecked")
    public static <E> E invokeMethod(final Object obj, final String methodName, final Class<?>[] parameterTypes,
            final Object[] args)
    {
        if (obj == null || methodName == null)
        {
            return null;
        }
        Method method = getAccessibleMethod(obj, methodName, parameterTypes);
        if (method == null)
        {
            logger.debug("在 [" + obj.getClass() + "] 中,没有找到 [" + methodName + "] 方法 ");
            return null;
        }
        try
        {
            return (E) method.invoke(obj, args);
        }
        catch (Exception e)
        {
            String msg = "method: " + method + ", obj: " + obj + ", args: " + args + "";
            throw convertReflectionExceptionToUnchecked(msg, e);
        }
    }

编写不易,望看到这的各位点一个免费赞,谢谢~ 

 

Guess you like

Origin blog.csdn.net/weixin_42505381/article/details/130347859