昨天有位刚入行的java工程师问我有没有什么方法直接执行通过远程调用获取到的公式,我当时脑子里面第一冒出来是js的eval函数,我就告诉他js的eval()可以实现他的需求,当时由于他没怎么接触js,听得一脸懵逼,我这才反应过来他是写java的。由于我的工作中很少遇到这种应用场景,当时我也没想起java里面怎么实现,当时的想法是把那个公式当作一段java代码,然后实时编译、执行;转念又一想,java这么古老强大的语言,这种应用场景肯定早就有很好的原生解决方案了。搜索了一下,找到2种实现方案。1、JDK1.6里面的ScriptEngine;2、JEXL。
下面分别说明一下2种方案的具体使用。
ScriptEngine
JDK1.6引入ScriptEngine,用于执行JavaScript这样的脚本语言,所以js的eval函数当然也可以通过它来执行。
public static void test1(){
String ddd = "10+20";
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("js");
Object result = null;
try {
result = engine.eval(ddd);
} catch (ScriptException e) {
e.printStackTrace();
}
System.out.println("结果类型:" + result.getClass().getName() + ",计算结果:" + result);
}
JEXL
Java Expression Language (JEXL) 是一个表达式语言引擎,可以用来在应用或者框架中使用。JEXL 受Velocity 和 JSP 标签库 1.1 (JSTL) 的影响而产生的。需要注意的是, JEXL 并不是 JSTL 中的表达式语言的实现。
使用JEXL需要引入对应的jar包。
org.apache.commons
commons-jexl3
3.1
具体使用如下:
public static void test2(){
JexlEngine jexl = new JexlBuilder().create();
String jexlExp = "10+20";
JexlExpression e = jexl.createExpression( jexlExp );
// Create a context and add data
JexlContext jc = new MapContext();
//jc.set("foo", new Foo() );
Object result= e.evaluate(jc);
System.out.println("结果类型:" + result.getClass().getName() + ",计算结果:" + result);
}