记录一下工作中遇到的模版替换经历,在这次工作中遇到需要进行消息模版的内容替换。我选择在消息模版待替换位置用特殊字符包裹实体类中的属性名,然后替换则是通过反射将值替换到字符串中。事不宜迟,上代码!!!
- 工具类函数代码
/**
* @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);
}
}
编写不易,望看到这的各位点一个免费赞,谢谢~