什么是脚本引擎,脚本引擎是指在程序运行期间嵌入另一种脚本语言,并与其交互,产生最终运行结果

脚本引擎存在的意义是什么?脚本引擎可以改变编译语言的内部运行逻辑,弥补编译语言的不足,使编译语言具备动态语言的一部分特性。

是否有成功案例?最成功的案例就是基于C++和Lua语言开发的端游(网游一种,需要按照客户端),编译语言最大的缺点就是客户端升级需要重新安装并且安装之后重启应用程序才能生效。脚本引擎弥补了这项致命的缺点,用户只需升级剧情脚本,而不需要退出整个游戏然后重新进入。

1.11.1. Maven

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>cn.netkiller</groupId><artifactId>script</artifactId><version>0.0.1-SNAPSHOT</version><name>Java Script</name><description>Java Script Engine</description><dependencies><!-- https://mvnrepository.com/artifact/org.mockito/mockito-all --><dependency><groupId>org.mockito</groupId><artifactId>mockito-all</artifactId><version>1.10.19</version></dependency></dependencies><build><sourceDirectory>src</sourceDirectory><plugins><plugin><artifactId>maven-compiler-plugin</artifactId><version>3.5.1</version><configuration><source>1.8</source><target>1.8</target></configuration></plugin></plugins></build>
</project>

1.11.2. Helloworld

package cn.netkiller.javascript;import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;import javax.script.ScriptEngine;
import javax.script.ScriptEngineFactory;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;public class Helloworld {public Helloworld() {ScriptEngineManager manager = new ScriptEngineManager();List<ScriptEngineFactory> factories = manager.getEngineFactories();for (ScriptEngineFactory f : factories) {System.out.println("egine name:" + f.getEngineName());System.out.println("engine version:" + f.getEngineVersion());System.out.println("language name:" + f.getLanguageName());System.out.println("language version:" + f.getLanguageVersion());System.out.println("names:" + f.getNames());System.out.println("mime:" + f.getMimeTypes());System.out.println("extension:" + f.getExtensions());System.out.println("-----------------------------------------------");}}public void hello() throws ScriptException {ScriptEngineManager manager = new ScriptEngineManager();ScriptEngine engine = manager.getEngineByName("JavaScript");// ScriptEngine engine = manager.getEngineByExtension("js");// ScriptEngine engine = manager.getEngineByMimeType("text/javascript");engine.eval("print('Hello, World')");}public static void main(String[] args) {try {new Helloworld().hello();} catch (ScriptException ex) {Logger.getLogger(Helloworld.class.getName()).log(Level.SEVERE, null, ex);}}
}

1.11.3. 运行脚本文件

将脚本放入外部文件

package javascript;import java.io.FileNotFoundException;
import java.net.URL;import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;public class EvalFile {public static void main(String[] args) {// TODO Auto-generated method stubScriptEngineManager manager = new ScriptEngineManager();ScriptEngine engine = manager.getEngineByExtension("js");// ScriptEngine engine = manager.getEngineByMimeType("text/javascript");try {URL location = EvalFile.class.getProtectionDomain().getCodeSource().getLocation();String file = location.getFile() + "test.js";System.out.println(file);engine.eval(new java.io.FileReader(file));} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (ScriptException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}

test.js

print("This is hello from test.js");       

1.11.4. 变量传递

package javascript;import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;import javax.script.Bindings;
import javax.script.ScriptContext;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import javax.script.SimpleBindings;public class ScriptVars {ScriptEngine engine = null;public ScriptVars() {ScriptEngineManager manager = new ScriptEngineManager();engine = manager.getEngineByMimeType("text/javascript");}public void variable() throws ScriptException {engine.put("name", "Neo");engine.eval("var message = 'Hello, ' + name;");engine.eval("print(message);");Object obj = engine.get("message");System.out.println(obj);}public void simpleBindings() throws ScriptException {Bindings bindings = new SimpleBindings();bindings.put("name", "Neo");engine.eval("print('I am ' + name);", bindings);}public void function() throws ScriptException {engine.put("a", 4);engine.put("b", 6);Object maxNum = engine.eval("function max_num(a,b){return (a>b)?a:b;}max_num(a,b);");System.out.println("max_num:" + maxNum + ", (class = " + maxNum.getClass() + ")");Map<String, Integer> m = new HashMap<String, Integer>();m.put("c", 10);engine.put("m", m);engine.eval("var x= max_num(a,m.get('c'));");System.out.println("max_num:" + engine.get("x"));}public void object() throws ScriptException {File f = new File("test.txt");// expose File object as variable to scriptengine.put("file", f);// evaluate a script string. The script accesses "file"// variable and calls method on itengine.eval("print(file.getAbsolutePath())");}public void outputToFile() throws IOException, ScriptException {ScriptContext context = engine.getContext();context.setWriter(new FileWriter("script.log"));engine.eval("print('Hello World!');");}public static void main(String[] args) {// TODO Auto-generated method stubtry {ScriptVars sv = new ScriptVars();sv.variable();sv.simpleBindings();sv.outputToFile();sv.function();sv.object();sv.outputToFile();} catch (ScriptException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}

1.11.5. 全局变量与局部变量定义

ScriptContext.GLOBAL_SCOPE 作用于 ScriptEngineManager, ScriptContext.ENGINE_SCOPE 作用于 ScriptEngine

package javascript;import javax.script.ScriptContext;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;public class ContextVariable {public static void main(String[] args) throws ScriptException {// TODO Auto-generated method stubScriptEngineManager manager = new ScriptEngineManager();ScriptEngine engine = manager.getEngineByName("JavaScript");ScriptContext context = engine.getContext();  context.setAttribute("name", "Netkiller", ScriptContext.GLOBAL_SCOPE);  context.setAttribute("name", "Neo", ScriptContext.ENGINE_SCOPE);  //context.getAttribute("name"); engine.eval("print('I am ' + name);", context);// engine1,context1 并没有定义 name 但输出结果却显示 Netkiller,所以ScriptContext.GLOBAL_SCOPE定义的变量是全局的。 ScriptEngine engine1 = manager.getEngineByName("JavaScript");ScriptContext context1 = engine1.getContext();  engine.eval("print('I am ' + name);", context1);}}      
import javax.script.*;public class MultiScopes {public static void main(String[] args) throws Exception {ScriptEngineManager manager = new ScriptEngineManager();ScriptEngine engine = manager.getEngineByName("JavaScript");engine.put("x", "hello");// print global variable "x"engine.eval("print(x);");// the above line prints "hello"// Now, pass a different script contextScriptContext newContext = new SimpleScriptContext();Bindings engineScope = newContext.getBindings(ScriptContext.ENGINE_SCOPE);// add new variable "x" to the new engineScopeengineScope.put("x", "world");// execute the same script - but this time pass a different script contextengine.eval("print(x);", newContext);// the above line prints "world"}
}

1.11.6. 调用脚本中的函数或方法

package javascript;import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;public class InvokeScriptFunction {public static void main(String[] args) throws ScriptException, NoSuchMethodException {// TODO Auto-generated method stubScriptEngineManager manager = new ScriptEngineManager();ScriptEngine engine = manager.getEngineByName("JavaScript");// JavaScript code in a StringString script = "function hello(name) { print('Hello, ' + name); }";// evaluate scriptengine.eval(script);// javax.script.Invocable is an optional interface.// Check whether your script engine implements or not!// Note that the JavaScript engine implements Invocable interface.Invocable inv = (Invocable) engine;// invoke the global function named "hello"inv.invokeFunction("hello", "Scripting!!");// JavaScript code in a String. This code defines a script object 'obj'// with one method called 'hello'.script = "var obj = new Object(); obj.hello = function(name) { print('Hello, ' + name); }";// evaluate scriptengine.eval(script);// get script object on which we want to call the methodObject obj = engine.get("obj");// invoke the method named "hello" on the script object "obj"inv.invokeMethod(obj, "hello", "Script Method !!");}
}

1.11.7. 脚本编译

只有重复执行脚本时才需要编译。只运行一次不建议编译运行。

package javascript;import javax.script.*;public class ScriptCompile {public CompiledScript compile(String script) throws ScriptException {ScriptEngineManager manager = new ScriptEngineManager();ScriptEngine engine = manager.getEngineByName("JavaScript");return ((Compilable) engine).compile(script);}public static void main(String[] args) {// TODO Auto-generated method stubScriptCompile sc = new ScriptCompile();try {CompiledScript script = sc.compile("print('Helloworld!!!');");for (int i = 0; i < 100; i++) {script.eval();}} catch (ScriptException ex) {ex.printStackTrace();}}}

1.11.8. jjs - Invokes the Nashorn engine.

jjs 是一个在命令行运行脚本的命令

创建脚本文件

[neo@netkiller tmp]$ cat test.js
function f() { return 1;
}; print( f() + 1 );

运行结果

[neo@netkiller tmp]$ jjs test.js
2       
        

原文出处:Netkiller 系列 手札
本文作者:陈景峯
转载请与作者联系,同时请务必标明文章原始出处和作者信息及本声明。

1.11. 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 脚本引擎的使用

    文章目录 1. 前言 2. 脚本引擎的使用 2.1 脚本参数传递 2.2 脚本编译 2.3 脚本动态调用 1. 前言 Java 6 版本就已经引入了 Rhino 引擎用以支持脚本代码运行,而从 Jav ...

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

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

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

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

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

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

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

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

最新文章

  1. html5 settimeout,计时器setTimeout()
  2. log file sync(日志文件同步) 与 Log file parallel write 等待事件
  3. [导入]C++ GUi 选择
  4. 解决为什么导入了tomcat进入myeclipse却在server中找不到
  5. portal认证 php,如何用PHP制作OSSH 免费版华为Portal系统认证前端页面
  6. Shell脚本编程与文件系统修复
  7. oracle 嵌套表 例子,什么是Oracle中的嵌套表对象?
  8. Houdini12:渲染-渲染器SHOP
  9. 同时看过 unreal4 和 Unity 源代码的人觉得哪个引擎架构更好?
  10. whatsns与tipask_tipask转whatsns问答系统插件
  11. 美国计算机专业gre314,托福89,GRE 314获南加大计算机录取
  12. 如何修改CAD制图时光标尺寸大小?
  13. Visual Studio 好用的插件
  14. 魔力宝贝服务器修改器装备,【法兰城的回忆】魔力宝贝游戏手工架设服务端+客户端修改工具+流程说明...
  15. 水溶的球形金纳米颗粒浓度1mg/ml|纳米金粒径13nm|Ag@SiO2核壳纳米粒子内核15nm外核5nm
  16. 【ROS入门学习01| ROS命令行工具的使用】
  17. 专科学游戏建模好找工作嘛?
  18. 仿淘宝物流的跟踪图,不需要自定义时间轴
  19. 误码率matlab怎么计算,关于误码率的问题 急!!!!!
  20. 字扩展,位扩展,和字位扩展_价格合理,可扩展的网站简介

热门文章

  1. oledb 获取所有表的名字和列名
  2. Appium_pytest fixture的使用
  3. python 全栈开发,Day66(web应用,http协议简介,web框架)
  4. [搬运工系列]-JMeter(二十四)搭建持续集成接口测试平台(Jenkins+Ant+Jmeter)
  5. 连接MYSQL的时候报错(找不到请求的.net framework data provider。可能没有安装
  6. 关于静态类初始化问题----CSharp
  7. 谈谈我对Spring IOC的理解
  8. vue调试工具vue-devtools安装及使用
  9. Spring【AOP模块】就是这么简单
  10. Openfire及Spark配置(Mac)