Funktion des Java-Tools: Ersetzen Sie den Wert des Entitätsklassenattributs zwischen Sonderzeichen

        Notieren Sie die Erfahrung der Vorlage Bei der Arbeit aufgetretener Ersatz. Während dieser Arbeit stieß ich auf die Notwendigkeit, den Inhalt der Nachrichtenvorlage zu ersetzen. Ich habe mich dafür entschieden, den Attributnamen in der Entitätsklasse an der zu ersetzenden Position in der Nachrichtenvorlage mit Sonderzeichen zu umschließen und dann den Wert durch Reflektion in eine Zeichenfolge zu ersetzen. Kommen wir ohne weitere Umschweife zum Code! ! !

  • Werkzeugfunktionscode
    /**
     * @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;
    }
  • Reflection-Schlüsselcode
    /**
     * 调用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);
        }
    }

Es ist nicht einfach zu schreiben. Ich hoffe, dass jeder, der das sieht, mir ein kostenloses „Gefällt mir“ geben kann, danke ~ 

 

Supongo que te gusta

Origin blog.csdn.net/weixin_42505381/article/details/130347859
Recomendado
Clasificación