diff --git a/hutool-extra/pom.xml b/hutool-extra/pom.xml
index 395140b56..5806b4ce2 100644
--- a/hutool-extra/pom.xml
+++ b/hutool-extra/pom.xml
@@ -410,6 +410,13 @@
compile
true
+
+ org.mozilla
+ rhino
+ 1.7.12
+ compile
+ true
+
org.apache.commons
diff --git a/hutool-extra/src/main/java/cn/hutool/extra/expression/engine/rhino/RhinoEngine.java b/hutool-extra/src/main/java/cn/hutool/extra/expression/engine/rhino/RhinoEngine.java
new file mode 100644
index 000000000..eef25ffc4
--- /dev/null
+++ b/hutool-extra/src/main/java/cn/hutool/extra/expression/engine/rhino/RhinoEngine.java
@@ -0,0 +1,41 @@
+package cn.hutool.extra.expression.engine.rhino;
+
+import cn.hutool.extra.expression.ExpressionEngine;
+import org.mozilla.javascript.Context;
+import org.mozilla.javascript.Scriptable;
+import org.mozilla.javascript.ScriptableObject;
+
+import java.util.Map;
+
+/**
+ * rhino引擎封装
+ * 见:https://github.com/mozilla/rhino
+ *
+ * @since 5.5.2
+ * @author lzpeng
+ */
+public class RhinoEngine implements ExpressionEngine {
+
+ /**
+ * 构造
+ */
+ public RhinoEngine(){
+ }
+
+ @Override
+ public Object eval(String expression, Map context) {
+ Context ctx = Context.enter();
+ Scriptable scope = ctx.initStandardObjects();
+ if (context != null && !context.isEmpty()) {
+ for (Map.Entry entry : context.entrySet()) {
+ // 将java对象转为js对象
+ Object jsObj = Context.javaToJS(entry.getValue(), scope);
+ // 将java对象放置JS的作用域中
+ ScriptableObject.putProperty(scope, entry.getKey(), jsObj);
+ }
+ }
+ Object result = ctx.evaluateString(scope, expression, "rhino.js", 1, null);
+ Context.exit();
+ return result;
+ }
+}
diff --git a/hutool-extra/src/main/java/cn/hutool/extra/expression/engine/rhino/package-info.java b/hutool-extra/src/main/java/cn/hutool/extra/expression/engine/rhino/package-info.java
new file mode 100644
index 000000000..8129782be
--- /dev/null
+++ b/hutool-extra/src/main/java/cn/hutool/extra/expression/engine/rhino/package-info.java
@@ -0,0 +1,7 @@
+/**
+ * rhino引擎封装
+ * 见:https://github.com/mozilla/rhino
+ *
+ * @author lzpeng
+ */
+package cn.hutool.extra.expression.engine.rhino;
\ No newline at end of file
diff --git a/hutool-extra/src/main/resources/META-INF/services/cn.hutool.extra.expression.ExpressionEngine b/hutool-extra/src/main/resources/META-INF/services/cn.hutool.extra.expression.ExpressionEngine
index 98ae64b5b..760331b46 100644
--- a/hutool-extra/src/main/resources/META-INF/services/cn.hutool.extra.expression.ExpressionEngine
+++ b/hutool-extra/src/main/resources/META-INF/services/cn.hutool.extra.expression.ExpressionEngine
@@ -2,4 +2,5 @@ cn.hutool.extra.expression.engine.aviator.AviatorEngine
cn.hutool.extra.expression.engine.jexl.JexlEngine
cn.hutool.extra.expression.engine.mvel.MvelEngine
cn.hutool.extra.expression.engine.jfireel.JfireELEngine
-cn.hutool.extra.expression.engine.spel.SpELEngine
\ No newline at end of file
+cn.hutool.extra.expression.engine.spel.SpELEngine
+cn.hutool.extra.expression.engine.rhino.RhinoEngine
\ No newline at end of file
diff --git a/hutool-extra/src/test/java/cn/hutool/extra/expression/ExpressionUtilTest.java b/hutool-extra/src/test/java/cn/hutool/extra/expression/ExpressionUtilTest.java
index fe68ea7b8..8802ad4b3 100644
--- a/hutool-extra/src/test/java/cn/hutool/extra/expression/ExpressionUtilTest.java
+++ b/hutool-extra/src/test/java/cn/hutool/extra/expression/ExpressionUtilTest.java
@@ -4,6 +4,7 @@ import cn.hutool.core.lang.Dict;
import cn.hutool.extra.expression.engine.jexl.JexlEngine;
import cn.hutool.extra.expression.engine.jfireel.JfireELEngine;
import cn.hutool.extra.expression.engine.mvel.MvelEngine;
+import cn.hutool.extra.expression.engine.rhino.RhinoEngine;
import cn.hutool.extra.expression.engine.spel.SpELEngine;
import org.junit.Assert;
import org.junit.Test;
@@ -67,4 +68,17 @@ public class ExpressionUtilTest {
final Object eval = engine.eval("#a-(#b-#c)", dict);
Assert.assertEquals(-143.8, (double)eval, 2);
}
+
+ @Test
+ public void rhinoTest(){
+ ExpressionEngine engine = new RhinoEngine();
+
+ final Dict dict = Dict.create()
+ .set("a", 100.3)
+ .set("b", 45)
+ .set("c", -199.100);
+ final Object eval = engine.eval("a-(b-c)", dict);
+ Assert.assertEquals(-143.8, (double)eval, 2);
+ }
+
}