`
QING____
  • 浏览: 2245453 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java-Scripting代码备忘

    博客分类:
  • JAVA
 
阅读更多

    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);
	
}
3
1
分享到:
评论
1 楼 liujunhao225 2016-03-22  
通过你这篇文章,了解到ScriptEngineManager的使用方法,感谢。

相关推荐

    JDK14-java-scripting-programmers-guide.pdf

    * 动态性:Java Scripting允许开发者在运行时动态加载和执行脚本代码。 * 跨语言性:Java Scripting支持多种脚本语言,可以与Java语言进行无缝集成。 * 高度可扩展性:Java Scripting提供了一种灵活的方式来扩展和...

    kotlin-scripting-compiler-impl.jar

    kotlin-scripting-compiler-impl.jar

    JDK11-java-scripting-programmers-guide.pdf

    Java Scripting Programmer's Guide Java Scripting Programmer's Guide 是 Oracle 公司发布的一份关于 Java 平台标准版的脚本编程指南,旨在帮助开发者更好地使用 Java 脚本编程语言。以下是该指南中所涉及到的...

    JDK12-java-scripting-programmers-guide.pdf

    脚本引擎是Java Scripting API的核心组件,负责执行脚本代码。Java Scripting API提供了多种脚本引擎,包括 Rhino引擎、 Nashorn引擎等。每种引擎都有其特点和优点,开发人员可以根据需要选择合适的引擎。 脚本上...

    kotlin-scripting-common.jar

    kotlin-scripting-common.jar

    JDK13-java-scripting-programmers-guide.pdf

    Java.Scripting.Programmer's.Guide Java Scripting Programmer's Guide是Java Platform, Standard Edition的组件之一,提供了Java脚本引擎的编程指南。该指南详细介绍了Java脚本引擎的架构、配置、编程模型、安全...

    struts-scripting-1.0.1

    4. **性能影响**:虽然脚本语言提供了便利,但相比Java代码,它们的运行速度可能较慢。在性能敏感的应用中,需要权衡使用脚本语言的利弊。 5. **安全问题**:引入脚本语言可能会带来额外的安全风险,比如代码注入。...

    Advanced Bash-Scripting Guide 3.9.1 (包括中译本)

    Advanced Bash-Scripting Guide 3.9.1 (包括中译本) 作者:thegrendel 主页:http://personal.riverusers.com/~thegrendel 中译本:杨春敏(chunmin.yang at gmail.com) 黄毅 (linuxprogram at gmail.com)...

    Advanced Bash-Scripting Guide 中英版及源码

    函数可以将代码组织成可重用的部分,提高脚本的可读性和维护性。 4. **输入/输出**:理解标准输入、标准输出和标准错误的概念,以及如何使用重定向操作符(如&lt;、&gt;、&gt;&gt;)来改变输入和输出的流向。 5. **管道和...

    Advanced Bash-Scripting Guide 6.6.CHM

    Bash脚本高级指南(Advanced Bash-Scripting Guide)是学习shell的经典指南,其中内容详细,实例丰富,且根据Bash的发展不断更新,此资源是Advanced Bash-Scripting Guide的最新版本6.6,更新于2012.11.27,是本人...

    ug894-vivado-tcl-scripting.pdf

    《Vivado Design Suite User Guide: Using Tcl Scripting UG894》是一份详细指导文档,旨在帮助用户掌握如何在Vivado中有效地利用Tcl进行脚本编写。该文档的2022.2版本发布于2022年10月19日,提供了关于Tcl在Vivado...

    struts-scripting-1.0.1-src

    5. **性能与安全性**: 虽然脚本语言提供了便利,但可能在性能上不如编译后的Java代码。因此,在大型项目中,需要权衡脚本语言的灵活性和性能损失。此外,由于脚本语言的动态性,也可能带来安全风险,比如脚本注入...

    photoshop-cc-scripting-guide-2015.pdf

    在"Conventions in this Guide"章节中,作者会定义和解释文档中使用的各种约定和符号,包括代码示例的表示方法,以及特殊术语的定义,以便读者能更准确地理解和应用文档内容。 接着,指南会逐步引导读者了解如何...

    HFSS-MATLAB-SCRIPTING-API

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

    Scripting in Java-带书签目录超清文字版.pdf

    脚本语言在现代软件开发中的应用越来越广泛,Java平台通过引入JSR 223(Java Scripting API)和JSR 433(Java Scripting for the JVM)使得在Java环境中使用脚本语言变得可能和方便。本书详细探讨了如何在Java应用...

    AE脚本设计参考手册(After-Effects-CS6-Scripting-Guide)

    AE脚本设计参考手册(After-Effects-CS6-Scripting-Guide) 本文档是Adobe After Effects CS6的脚本设计参考手册,提供了关于After Effects CS6的脚本编程指南。以下是本手册的详细知识点总结: 一、After Effects...

    Advanced Bash-Scripting Guide(pdf)

    《Advanced Bash-Scripting Guide》是一本深入探讨Bash脚本艺术的高级开发指南。这本书详细介绍Bash shell脚本的语法、常用命令和开发技巧。书中包含大量实例,经过众多高手修正,是学习Bash脚本的必读书籍。 首先...

    高级Bash脚本编程指南(Advanced Bash-Scripting Guide)中英文版本

    **高级Bash脚本编程指南(Advanced Bash-Scripting Guide)是学习Bash shell脚本编写的一本权威性教程,适合各个层次的用户,无论是初学者还是经验丰富的开发者,都能从中受益。Bash shell是Linux和Unix系统中最常用的...

    Advanced Bash-Scripting Guide (包括中译本)

    3. **函数**:通过定义和调用函数,可以将重复的代码模块化,提高脚本的可读性和可维护性。学习如何创建和使用自定义函数是提高脚本组织能力的关键。 4. **输入/输出重定向**:Bash允许我们改变程序的默认输入和...

Global site tag (gtag.js) - Google Analytics