言成言成啊 | Kit Chen's Blog

Java执行动态脚本

2022-07-31 02:22:33

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);
//false
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 {


/**
* 导包
* <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

导入依赖

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 {


/**
* <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

发布:2022-07-31 02:22:33
修改:2022-07-31 10:06:30
链接:https://meethigher.top/blog/2022/java-dynamic-script/
标签:java 
付款码 打赏 分享
shift+ctrl+1可控制目录显示