文章目录

  • 1. 前言
  • 2. 脚本引擎的使用
    • 2.1 脚本参数传递
    • 2.2 脚本编译
    • 2.3 脚本动态调用

1. 前言

Java 6 版本就已经引入了 Rhino 引擎用以支持脚本代码运行,而从 Java 8 开始 Nashorn 取代 Rhino 成为 Java 内嵌的 JavaScript 引擎。Nashorn 引擎允许开发人员将 JavaScript 代码嵌入到 Java 中执行,这个特性在复杂的配置系统中有比较大的应用价值,可以满足特定场景下的灵活性要求

以下示例代码可以列出所有脚本引擎工厂的相关属性,可以看到其支持的脚本引擎包括了 JavaScript 等

    public static void main(String[] args) {ScriptEngineManager manager = new ScriptEngineManager();manager.getEngineFactories().forEach(factory -> System.out.printf("Name: %s%n" +"Version: %s%n" +"Language name: %s%n" +"Language version: %s%n" +"Extensions: %s%n" +"Mime types: %s%n" +"Names: %s%n",factory.getEngineName(),factory.getEngineVersion(),factory.getLanguageName(),factory.getLanguageVersion(),factory.getExtensions(),factory.getMimeTypes(),factory.getNames()));}

2. 脚本引擎的使用

Java 脚本引擎 API 中最主要的是 ScriptEngineManager,开发者可以通过这个类获取当前 Java 版本所支持的所有脚本引擎,具体获取脚本引擎的方法有以下3种:

  1. 根据扩展名得到脚本引擎

     ScriptEngineManager manager = new ScriptEngineManager();// getEngineByExtension 的参数就是 Extensions:[js]中任一个ScriptEngine engine = manager.getEngineByExtension("js");
    
  2. 根据Mime类型得到脚本引擎
    ScriptEngineManager manager = new ScriptEngineManager();
    // getEngineByMimeType 的参数可以是 Mime types: [application/javascript, application/ecmascript, text/javascript, text/ecmascript]中的任一个
    ScriptEngine engine = manager.getEngineByMimeType("text/javascript");
    
  3. 根据名称得到脚本引擎
    ScriptEngineManager manager = new ScriptEngineManager();
    // getEngineByName 的参数可以是 Names: [js, rhino, JavaScript, javascript, ECMAScript, ecmascript]
    // 中的任一个
    ScriptEngine engine = manager.getEngineByName("javascript");
    

2.1 脚本参数传递

脚本引擎除了简单的执行功能,还可以通过它向脚本中传递参数,同时也可以将脚本中的变量值取出来。这些功能要依靠 ScriptEngine#put()ScriptEngine#get() 方法,以下为代码示例

    public static void main(String[] args) {ScriptEngineManager manager = new ScriptEngineManager();// 获取javascript脚本引擎ScriptEngine engine = manager.getEngineByName("js");try {// 参数出入engine.put("name", "lucky");// 开始执行脚本engine.eval("var output ='' ;" +"for (i = 0; i <= name.length; i++) {" +"    output = name.charAt(i) + output" +"}");// 得到output变量的值String name = (String) engine.get("output");System.out.printf("被翻转后的字符串:%s", name);} catch (Exception e) {System.err.println(e);}}

2.2 脚本编译

如我们所知,脚本解释执行的运行方式性能很低,但是不少脚本语言都支持编译功能,因此 Java 的脚本引擎也对编译进行了支持。如果某段脚本要运行多次的话,可以使用编译的方式将其转化为执行效率更高的形式,从而提高性能

具体做法是调用 ScriptEngine#compile() 方法进行脚本编译,不过只有实现了Compilable 接口的脚本引擎才可以进行编译,可参考以下示例

    public static void main(String[] args) {ScriptEngineManager manager = new ScriptEngineManager();// 得到javascript脚本引擎ScriptEngine engine = manager.getEngineByName("js");try {// 可编译的脚本,提高执行速度engine.put("counter", 0);// 判断这个脚本引擎是否支持编译功能if (engine instanceof Compilable) {Compilable compEngine = (Compilable) engine;CompiledScript script = compEngine.compile("function count() { " +"    counter = counter +1; " +"    return counter; " +"};" +"count();");System.out.printf("Counter: %s%n", script.eval());System.out.printf("Counter: %s%n", script.eval());System.out.printf("Counter: %s%n", script.eval());}} catch (Exception e) {System.err.println(e);}}

2.3 脚本动态调用

业务系统运行时通常需要将用户的输入作为入参执行函数,这就产生了脚本方法动态调用的需求。和编译一样,脚本引擎必须实现 Invocable 接口才可以动态调用脚本中的方法,具体可参考以下示例

    public static void main(String[] args) {ScriptEngineManager manager = new ScriptEngineManager();ScriptEngine engine = manager.getEngineByName("js");try {// 动态决定脚本调用String name = "nathan";if (engine instanceof Invocable) {engine.eval("function reverse(name) {" +" var output =' ';" +" for (i = 0; i <= name.length; i++) {" +"     output = name.charAt(i) + output" +" }" +" return output;" +"}");Invocable invokeEngine = (Invocable) engine;Object o = invokeEngine.invokeFunction("reverse", name);System.out.printf("翻转后的字符串:%s", o);}} catch (Exception e) {System.err.println(e);}}

Java 脚本引擎的使用相关推荐

  1. java 脚本引擎执行javascript脚本

    java脚本引擎是从JDK6.0之后添加的新功能,语法使用Rhino. public class ScriptTest {public static void main(String args[]) ...

  2. Java 脚本引擎 Rhino的学习

    转自 https://www.cnblogs.com/huang-changfan/p/10129518.html java脚本引擎 java脚本引擎是沟通java和脚本语句之间的桥梁,可以通过对应的 ...

  3. java rhino 下载_8.4(Java学习笔记)java脚本引擎(Rhino)

    一.java脚本引擎 java脚本引擎是沟通java和脚本语句之间的桥梁,可以通过对应的脚本引擎在java中调用各种脚本语言. 二.脚本引擎执行脚本代码 ScriptEngineManager:为Sc ...

  4. java fel_Java表达式引擎fel/groovy/expression4j/java脚本引擎的性能对比【原创】

    又是性能对比,最近跟性能较上劲了. 产品中需要用到数学表达式,表达式不复杂,但是对性能要求比较高.选用了一些常用的表达式引擎计算方案,包含:java脚本引擎(javax/script).groovy脚 ...

  5. Java脚本引擎执行js代码以及动态编译

    Java脚本引擎执行js代码 一.概述 JAVA脚本引擎是从JDK6.0之后添加的新功能. 使得 Java 应用程序可以通过一套固定的接口与各种脚本引擎交互,从 而达到在 Java 平台上调用各种脚本 ...

  6. 1.11. java 脚本引擎

    什么是脚本引擎,脚本引擎是指在程序运行期间嵌入另一种脚本语言,并与其交互,产生最终运行结果 脚本引擎存在的意义是什么?脚本引擎可以改变编译语言的内部运行逻辑,弥补编译语言的不足,使编译语言具备动态语言 ...

  7. java 脚本引擎性能_Java SE 6 入门之脚本引擎加大程序性能

    Java SE 6 入门之脚本引擎加大程序性能 Java SE 6较Java SE5有了很大的改进,它的性能更强,而且是专为Vista所设计,这就象征着Java SE 6将是Vista上的最佳抉择.而 ...

  8. 【Java脚本引擎】脚本引擎执行JavaScript代码

    应用场景 公司有30员工,每个人工资计算方式不同.现在需要计算工资. 传统的方法:一个接口,30个实现类. 使用脚本引擎:编写一个xml文件,每人一个计算公式,使用的时候可以把公式加载到程序中,启动时 ...

  9. java引擎组件_Java 脚本引擎入门

    Java Script Engine Java 脚本引擎可以将脚本嵌入Java代码中,可以自定义和扩展Java应用程序,自JDK1.6被引入,基于Rhino引擎,JDK1.8后使用Nashorn引擎, ...

最新文章

  1. EPSON机械手建立工具坐标系方法
  2. 如何加快Gensim Word2vec模型加载时间?
  3. 数据表格+弹出层的综合案例
  4. JAVA实现服务器间拷贝文件,寻找在Java服务器之间传输大文件的好方法
  5. Apache Accumulo 1.9.3 发布,高性能 K/V 存储方案
  6. 服务端渲染与 Universal React App
  7. Java高级语法笔记-枚举类型
  8. android toast
  9. 拓端tecdat|R语言逻辑回归和泊松回归模型对发生交通事故概率建模
  10. STM32神舟III号 驱动直流电机学习(一)
  11. 年龄血压对照表,每人都应该存一份!
  12. java 支付宝 验证签名失败,支付宝支付错误返回ILLEGAL_SIGN,签名验证错误
  13. Java语法糖以及实现
  14. clearcasse 命令
  15. 【UNR #6 B】机器人表演(DP)
  16. 利用逆矩阵简化矩阵多项式
  17. winform ui 设计参考
  18. 计算机毕业设计Python+uniapp+安卓电影院售票管理APP论文(WEB+APP+LW)
  19. Everything使用指南
  20. 一文带你学会使用 eclipse(图解详细)

热门文章

  1. Excel数据分析小技巧分享
  2. 3D VRay灯光应用步骤
  3. 手与大脑的距离决定了现实与理想的相似度
  4. Amazon DeepRacer训练日志分析范例与强化学习Reward Function设计
  5. 具有加速度的角色移动实现
  6. Linux挂载freenas的Nfs,在FreeNAS上配置FreeNAS以设置ZFS存储磁盘和创建NFS共享 - 第2部分...
  7. Java程序员开发5年,该如何制定自己的职业规划
  8. 参数绑定---bind函数
  9. 保底利率和保证利率是什么意思呢?有什么区别呀?
  10. AHST智能分选——“让世界更有序”