Java scripting工具包提供了java可以访问其他语言脚本的能力,脚本片段将会在运行时编译成中间代码(字节码),并能够被java scripting引擎调用。在某些场景下,很有用。
1. 简单调用
/** * simple,默认java.*包中的API已经倒入到engine中。你可以使用那些API * @throws Exception */ private static void invoke1() throws Exception{ ScriptEngineManager engineManager = new ScriptEngineManager(); ScriptEngine engine = engineManager.getEngineByName("javascript"); //根据“脚本语言名称”获取执行引擎,java本身默认只支持javascript,对于其他脚本,可以 //使用第三方包(apache bsf,不过不是很好用) //getEngineByName方法每次都会创建一个心的Engine对象 //java.lang包默认已经导入 String script = "var message = 'This is javascript.';println(message);var total = 2;"; engine.eval(script); Double total = (Double)engine.get("total"); System.out.println(total); }
2. 向JS脚本传递参数
/** * 向当前engine调用中put参数,并交给script * @throws Exception */ private static void invoke2() throws Exception{ ScriptEngineManager engineManager = new ScriptEngineManager(); ScriptEngine engine = engineManager.getEngineByName("javascript"); String script = "for(var i=0;i< times;i++) {println(i);}"; engine.put("times", 10); engine.eval(script); }
3. 在JS中使用java对象的方法或属性
private static void invoke3() throws Exception{ ScriptEngineManager engineManager = new ScriptEngineManager(); ScriptEngine engine = engineManager.getEngineByName("javascript"); String script = "println(string + ',length:' + string.length);"; engine.put("string", "javascript"); engine.eval(script); }
4. 显式的调用JS的function
private static void invoke4() throws Exception{ ScriptEngineManager engineManager = new ScriptEngineManager(); RhinoScriptEngine engine = (RhinoScriptEngine)engineManager.getEngineByName("javascript"); String script = "function hello(message){println(message);}"; engine.eval(script); engine.invokeFunction("hello", "javascript"); }
5. 调用JS方法并传递参数
/** * script方法调用 * @throws Exception */ private static void invoke5() throws Exception{ ScriptEngineManager engineManager = new ScriptEngineManager(); RhinoScriptEngine engine = (RhinoScriptEngine)engineManager.getEngineByName("javascript"); String script = "function hello(message){println(message);}"; engine.eval(script); engine.invokeFunction("hello", "javascript"); }
6. 通过JS创建Object,并在JAVA中使用(JS面向对象)
/** * 在script中使用对象,创建对象,并调用script对象的方法 * @throws Exception */ private static void invoke6() throws Exception{ ScriptEngineManager engineManager = new ScriptEngineManager(); RhinoScriptEngine engine = (RhinoScriptEngine)engineManager.getEngineByName("javascript"); //user是一个全局对象,和js一致 String script = "var user = new Object();" + "user.name='';" + "user.age=1;" + "user.toString = function(){println('Name:' + user.name + ',age' + user.age)};" + "user.init = function(name,age){user.name = name;user.age = age};"; engine.eval(script); Object user = engine.get("user"); engine.invokeMethod(user, "init", "zhangsan",32); engine.invokeMethod(user, "toString", null); }
7. JS与面向对象
/** * 调用script中的function,使用function返回的值 * @throws Exception */ private static void invoke7() throws Exception{ ScriptEngineManager engineManager = new ScriptEngineManager(); RhinoScriptEngine engine = (RhinoScriptEngine)engineManager.getEngineByName("javascript"); //API String script = "function create(name,age){var user = new Object();user.name= name;user.age = age; return user};" + "function toString(user){println('Name:' + user.name + ',age:' + user.age);};"; engine.eval(script); Object user = engine.invokeFunction("create", "zhangsan",32); engine.invokeFunction("toString", user); }
8. 在JS脚本中,引入JAVA API
/** * 外部API的倒入和使用 * @throws Exception */ private static void invoke8() throws Exception{ ScriptEngineManager engineManager = new ScriptEngineManager(); RhinoScriptEngine engine = (RhinoScriptEngine)engineManager.getEngineByName("javascript"); String script = "importClass(org.apache.commons.lang.time.DateFormatUtils);" + "println(java.lang.System.currentTimeMillis());"; engine.eval(script); }
9. 在JS中使用java object:API混合使用
/** * 将java对象与JS结合使用 * @throws Exception */ private static void invoke9() throws Exception{ ScriptEngineManager engineManager = new ScriptEngineManager(); RhinoScriptEngine engine = (RhinoScriptEngine)engineManager.getEngineByName("javascript"); String script = "importClass(com.test.script.ScriptingTestMain.User);function info(user){return user.info();}"; User user = new User("zhangsan",32); engine.eval(script); String info = (String)engine.invokeFunction("info", user); System.out.println(info); }
10. JS-function作为JAVA 接口的实现
/** * 让js作为java API的实现类 * @throws Exception */ private static void invoke10() throws Exception{ ScriptEngineManager engineManager = new ScriptEngineManager(); RhinoScriptEngine engine = (RhinoScriptEngine)engineManager.getEngineByName("javascript"); String script = "function run(){var i = 0;while(i<100){println(i);i++;}}"; engine.eval(script); Runnable runnable = engine.getInterface(Runnable.class); Thread thread = new Thread(runnable); thread.start(); }
11. Engine与binding使用:参数传递和context管理
/** * 使用binding传递参数,类似于engine.put * @throws Exception */ private static void invoke11() throws Exception{ ScriptEngineManager engineManager = new ScriptEngineManager(); RhinoScriptEngine engine = (RhinoScriptEngine)engineManager.getEngineByName("javascript"); String script = "i;println(message);println(i)"; //default:ENGINE_SCOPE Bindings bindings = engine.createBindings();//Map bindings.put("message", "javascript"); bindings.put("i", "10"); engine.eval(script,bindings);//binding被当前eval使用 }
12. 尝试使用Context来保存engine执行的结果或者保持变量传递
/** * 使用context保存对象,以便在外部被使用 * @throws Exception */ private static void invoke12() throws Exception{ ScriptEngineManager engineManager = new ScriptEngineManager(); RhinoScriptEngine engine = (RhinoScriptEngine)engineManager.getEngineByName("javascript"); String script = "println(message)"; // ScriptContext engineContext = new SimpleScriptContext(); engineContext.setAttribute("globalMessage", "globalMessage", ScriptContext.ENGINE_SCOPE); engine.setContext(engineContext); engine.put("message", "javascript"); engine.eval(script); //GLOBAL_SCOPE似乎对JS引擎有些问题。 String globalMessage = (String)engine.getContext().getAttribute("globalMessage",ScriptContext.ENGINE_SCOPE); engine.put("message", globalMessage); engine.eval(script); }
相关推荐
* 动态性:Java Scripting允许开发者在运行时动态加载和执行脚本代码。 * 跨语言性:Java Scripting支持多种脚本语言,可以与Java语言进行无缝集成。 * 高度可扩展性:Java Scripting提供了一种灵活的方式来扩展和...
kotlin-scripting-compiler-impl.jar
Java Scripting Programmer's Guide Java Scripting Programmer's Guide 是 Oracle 公司发布的一份关于 Java 平台标准版的脚本编程指南,旨在帮助开发者更好地使用 Java 脚本编程语言。以下是该指南中所涉及到的...
脚本引擎是Java Scripting API的核心组件,负责执行脚本代码。Java Scripting API提供了多种脚本引擎,包括 Rhino引擎、 Nashorn引擎等。每种引擎都有其特点和优点,开发人员可以根据需要选择合适的引擎。 脚本上...
Java.Scripting.Programmer's.Guide Java Scripting Programmer's Guide是Java Platform, Standard Edition的组件之一,提供了Java脚本引擎的编程指南。该指南详细介绍了Java脚本引擎的架构、配置、编程模型、安全...
4. **性能影响**:虽然脚本语言提供了便利,但相比Java代码,它们的运行速度可能较慢。在性能敏感的应用中,需要权衡使用脚本语言的利弊。 5. **安全问题**:引入脚本语言可能会带来额外的安全风险,比如代码注入。...
kotlin-scripting-common.jar
Advanced Bash-Scripting Guide 3.9.1 (包括中译本) 作者:thegrendel 主页:http://personal.riverusers.com/~thegrendel 中译本:杨春敏(chunmin.yang at gmail.com) 黄毅 (linuxprogram at gmail.com)...
函数可以将代码组织成可重用的部分,提高脚本的可读性和维护性。 4. **输入/输出**:理解标准输入、标准输出和标准错误的概念,以及如何使用重定向操作符(如<、>、>>)来改变输入和输出的流向。 5. **管道和...
Bash脚本高级指南(Advanced Bash-Scripting Guide)是学习shell的经典指南,其中内容详细,实例丰富,且根据Bash的发展不断更新,此资源是Advanced Bash-Scripting Guide的最新版本6.6,更新于2012.11.27,是本人...
高级Bash脚本编程指南 原作者 Mendel Cooper 原书名 Advanced Bash-Scripting Guide 译者 黄毅 杨春敏 译者发布的是html和pdf版。pdf版只有3.7版,我花了点功夫基于最新的3.9做成了chm版。
5. **性能与安全性**: 虽然脚本语言提供了便利,但可能在性能上不如编译后的Java代码。因此,在大型项目中,需要权衡脚本语言的灵活性和性能损失。此外,由于脚本语言的动态性,也可能带来安全风险,比如脚本注入...
《Vivado Design Suite User Guide: Using Tcl Scripting UG894》是一份详细指导文档,旨在帮助用户掌握如何在Vivado中有效地利用Tcl进行脚本编写。该文档的2022.2版本发布于2022年10月19日,提供了关于Tcl在Vivado...
在"Conventions in this Guide"章节中,作者会定义和解释文档中使用的各种约定和符号,包括代码示例的表示方法,以及特殊术语的定义,以便读者能更准确地理解和应用文档内容。 接着,指南会逐步引导读者了解如何...
the HFSS Scripting Interface. This tool provides a set of MATLAB functions to create 3D objects in HFSS by generating the required HFSS Scripts. Basically, anything that can be done in HFSS user ...
脚本语言在现代软件开发中的应用越来越广泛,Java平台通过引入JSR 223(Java Scripting API)和JSR 433(Java Scripting for the JVM)使得在Java环境中使用脚本语言变得可能和方便。本书详细探讨了如何在Java应用...
AE脚本设计参考手册(After-Effects-CS6-Scripting-Guide) 本文档是Adobe After Effects CS6的脚本设计参考手册,提供了关于After Effects CS6的脚本编程指南。以下是本手册的详细知识点总结: 一、After Effects...
《Advanced Bash-Scripting Guide》是一本深入探讨Bash脚本艺术的高级开发指南。这本书详细介绍Bash shell脚本的语法、常用命令和开发技巧。书中包含大量实例,经过众多高手修正,是学习Bash脚本的必读书籍。 首先...
**高级Bash脚本编程指南(Advanced Bash-Scripting Guide)是学习Bash shell脚本编写的一本权威性教程,适合各个层次的用户,无论是初学者还是经验丰富的开发者,都能从中受益。Bash shell是Linux和Unix系统中最常用的...