Java执行动态脚本
Posted 言成言成啊
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java执行动态脚本相关的知识,希望对你有一定的参考价值。
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的,谁会在意那么多。本质用法不变即可。
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);
//false
System.out.println(eval);
执行Groovy
执行Groovy相对来说重量级一点。
引入依赖包
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-all</artifactId>
<version>3.0.10</version>
<type>pom</type>
</dependency>
执行groovy
import org.junit.Test;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
public class TestScript
/**
* 导包
* <dependency>
* <groupId>org.codehaus.groovy</groupId>
* <artifactId>groovy-all</artifactId>
* <version>3.0.10</version>
* <type>pom</type>
* </dependency>
*/
@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
导入依赖
<dependency>
<groupId>com.googlecode.aviator</groupId>
<artifactId>aviator</artifactId>
<version>5.3.0</version>
</dependency>
执行aviator
import com.googlecode.aviator.AviatorEvaluator;
import com.googlecode.aviator.Expression;
import org.junit.Test;
public class TestScript
/**
* <dependency>
* <groupId>com.googlecode.aviator</groupId>
* <artifactId>aviator</artifactId>
* <version>5.3.0</version>
* </dependency>
*/
@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
以上是关于Java执行动态脚本的主要内容,如果未能解决你的问题,请参考以下文章