Java智能计算

来源:互联网 发布:淘宝滑动验证码 编辑:程序博客网 时间:2024/05/20 10:13

昨天有位刚入行的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包。

<dependency>  <groupId>org.apache.commons</groupId>  <artifactId>commons-jexl3</artifactId>  <version>3.1</version></dependency>

具体使用如下:

  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);  }

原文:http://www.itclj.com/blog/5a011c0281c06e4103ef5126

原创粉丝点击