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执行动态脚本的主要内容,如果未能解决你的问题,请参考以下文章

Java执行动态脚本

java动态脚本执行效率对比评测

Java集成Jython及动态执行指定脚本

Java集成Jython及动态执行指定脚本

软件测试周刊(第58期):春光不必趁早,冬霜不会迟到。相聚离开,全部刚刚好。

软件测试周刊(第58期):春光不必趁早,冬霜不会迟到。相聚离开,全部刚刚好。