meethigher-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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值