Java执行一些动态的规则,使用动态字节码反而来说就太复杂了,所以Java提供了ScriptManager调用JavaScript、Groovy、Ruby以及Scheme和Haskell编写的脚本。
一、基于ScriptManager
简单记录下,ScriptManager执行JavaScript、Groovy的使用方法。
执行JavaScript
在新版JDK11中,Nashorn engine is planned to be removed from a future JDK release。
Nashorn是基于JavaScript的脚本引擎,但是由于JavaScript本身迭代太快,Nashorn难以维护,Java已经放弃。
不过虽然过时,但是不影响使用。毕竟JS那么多特性,作为一个Java的,谁会在意那么多。本质用法不变即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| import org.junit.Test;
import javax.script.ScriptEngine; import javax.script.ScriptEngineManager;
public class TestScript { @Test public void testJs() throws Exception { String elValue = "0.9"; String el = "(x<0.8478241755535717)&&(x>0.17470429385819297)"; ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("JavaScript"); engine.put("x", elValue); boolean eval = (boolean) engine.eval(el); System.out.println(eval); } }
|
执行Groovy
执行Groovy相对来说重量级一点。
引入依赖包
1 2 3 4 5 6
| <dependency> <groupId>org.codehaus.groovy</groupId> <artifactId>groovy-all</artifactId> <version>3.0.10</version> <type>pom</type> </dependency>
|
执行groovy
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| import org.junit.Test;
import javax.script.ScriptEngine; import javax.script.ScriptEngineManager;
public class TestScript {
@Test public void testGroovy() throws Exception { String elValue = "向晚"; String el = "return '我最爱的虚拟人物:'+hobby;"; ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("Groovy"); engine.put("hobby", elValue); String eval = (String) engine.eval(el); System.out.println(eval); } }
|
二、基于AviatorScript
导入依赖
1 2 3 4 5
| <dependency> <groupId>com.googlecode.aviator</groupId> <artifactId>aviator</artifactId> <version>5.3.0</version> </dependency>
|
执行aviator
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.Expression; import org.junit.Test;
public class TestScript {
@Test public void testAviator() { String elValue = "向晚"; String el = "return '我最爱的虚拟人物:'+hobby;"; Expression compile = AviatorEvaluator.compile(el); String eval = (String) compile.execute(compile.newEnv("hobby", elValue)); System.out.println(eval); } }
|
三、对比
简单的动态规则,还是js比较轻量一点。其余两个都太重量级了。
参考致谢
killme2008/aviatorscript: A high performance scripting language hosted on the JVM.
java中执行JS脚本:ScriptEngineManager_赤子之心513的博客-CSDN博客_java scriptenginemanager
java中使用groovy脚本执行_不负春光不负己的博客-CSDN博客
Java中运行js代码_java小白-说的博客-CSDN博客_java 执行js