工作当中需要执行 string 类型的 java code ,之前有同事用过 mvel ,调研之后发现太多于重量级了,我就想安安静静的执行一段 java 代码 然后得到返回值。后来由调研了一下 jexl3 ,相比于 mvel 用起来简单方便还能满足需求。
这里仅仅是 apache-commons-jexl3 的最简单的一个入门。我要达到一个什么样的目的呢?就是从map 中获取一个日期值,然后对这个值进行格式化
import com.ishansong.bigdata.common.util.DateUtils;
import org.apache.commons.jexl3.JexlBuilder;
import org.apache.commons.jexl3.JexlContext;
import org.apache.commons.jexl3.JexlEngine;
import org.apache.commons.jexl3.MapContext;
import org.junit.jupiter.api.Test;
import java.util.HashMap;
/**
* @author shengjk1
* @date 2020/6/30
*/
public class jcTest {
@Test
void getImpalaUrl() {
JexlEngine jexl;
JexlContext jc;
jexl = new JexlBuilder().create();
jc = new MapContext();
long l = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
HashMap<String, String> sourceMap = new HashMap<>();
sourceMap.put("ctime", "20200321 12:23:22");
jc.set("map", sourceMap);
jc.set("dateUtils", DateUtils.class);
String rangExpression = "dateUtils.dateStrFormatDay(map['ctime'], 'yyyyMMdd')";
jexl.createExpression(rangExpression.trim()).evaluate(jc);
}
long l1 = System.currentTimeMillis();
System.out.println((l1 - l) / 10000.0);
}
}
DateUtils.class
import org.apache.commons.lang3.time.FastDateFormat;
import java.text.ParseException;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.Period;
import java.time.format.DateTimeFormatter;
import java.util.*;
/**
* @author shengjk1
*/
public class DateUtils {
/**
*
* @param dateStr
* @param format
* @return
* @throws ParseException
*/
public static String dateStrFormatDay(String dateStr, String format) throws ParseException {
FastDateFormat dateFormat = FastDateFormat.getInstance(format);
Date parse = dateFormat.parse(dateStr);
dateFormat=FastDateFormat.getInstance("yyyyMMdd");
return dateFormat.format(parse);
}
}