JDK6增加了对脚本语言的支持(JSR 223),原理上是将脚本语言编译成bytecode,这样脚本语言也能享用Java平台的诸多优势,包括可移植性,安全等,另外,由于现在是编译成bytecode后再执行,所以比原来边解释边执行效率要高很多。加入对脚本语言的支持后,对Java语言也提供了以下好处。
1、许多脚本语言都有动态特性,比如,你不需要用一个变量之前先声明它,你可以用一个变量存放完全不同类型的对象,你不需要做强制类型转换,因为转换都是自动的。现在Java语言也可以通过对脚本语言的支持间接获得这种灵活性。
2、 可以用脚本语言快速开发产品原型,因为现在可以Edit-Run,而无需Edit-Compile-Run,当然,因为Java有非常好的IDE支持,我 们完全可以在IDE里面编辑源文件,然后点击运行(隐含编译),以此达到快速开发原型的目的,所以这点好处基本上可以忽略。
3、通过引入脚本语言可以轻松实现Java应用程序的扩展和自定义,我们可以把原来分布在在Java应用程序中的配置逻辑,数学表达式和业务规则提取出来,转用JavaScript来处理。
Sun的JDK6实现包含了一个基于Mozilla Rhino的 脚本语言引擎,支持JavaScript,这并不是说明JDK6只支持JavaScript,任何第三方都可以自己实现一个JSR-223兼容的脚本引擎 使得JDK6支持别的脚本语言,比如,你想让JDK6支持Ruby,那你可以自己按照JSR 223的规范实现一个Ruby的脚本引擎类,具体一点,你需要实现
javax.script.ScriptEngine(简单起见,可以继承
javax.script.AbstractScriptEngine
)和
javax.script.ScriptEngineFactory两个接口。当然,在你实现自己的脚本语言引擎之前,先到
scripting.dev.java.net project 这里看看是不是有人已经帮你做了工作,这样你就可以直接拿来用就行。
Scripting API
--------------------------------------------------------------------------------
Scripting API是用于在Java里面编写脚本语言程序的API, 在Javax.script中可以找到Scripting API,我们就是用这个API来编写JavaScript程序,这个包里面有一个
ScriptEngineManager类,它是使用Scripting API的入口,ScriptEngineManager可以通过
jar服务发现(service discovery)机制寻找合适的脚本引擎类(ScriptEngine),使用Scripting API的最简单方式只需下面三步
1、创建一个
ScriptEngineManager对象
2、通过
ScriptEngineManager
获得ScriptEngine对象
3、用ScriptEngine的eval方法执行脚本
下面是一个Hello World程序
/**
* @author chinajash
*/
public class HelloScript {
public static void main(String[] args) throws Exception {
ScriptEngineManager factory = new ScriptEngineManager();//step 1
ScriptEngine engine = factory.getEngineByName("JavaScript");//Step 2
engine.eval("print('Hello, Scripting')");//Step 3
}
}
运行上面程序,控制台会输出
Hello, Scripting
上面这个简单的Scripting程序演示了如何在Java里面运行脚本语言,除此之外,我们还可以利用Scripting API实现以下功能
1、暴露Java对象为脚本语言的全局变量
2、在Java中调用脚本语言的方法
3、脚本语言可以实现Java的接口
4、脚本语言可以像Java一样使用JDK平台下的类
下面的类演示了以上4种功能
package Scripting;
import java.io.File;
import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
/**
* @author chinajash
*/
public class ScriptingAPITester {
public static void main(String[] args) throws Exception {
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("JavaScript");
testScriptVariables(engine);//演示如何暴露Java对象为脚本语言的全局变量
testInvokeScriptMethod(engine);//演示如何在Java中调用脚本语言的方法
testScriptInterface(engine);//演示脚本语言如何实现Java的接口
testUsingJDKClasses(engine);//演示脚本语言如何使用JDK平台下的类
}
public static void testScriptVariables(ScriptEngine engine) throws ScriptException{
File file = new File("test.txt");
engine.put("f", file);
engine.eval("println('Total Space:'+f.getTotalSpace())");
}
public static void testInvokeScriptMethod(ScriptEngine engine) throws Exception{
String script = "function hello(name) { return 'Hello,' + name;}";
engine.eval(script);
Invocable inv = (Invocable) engine;
String res = (String)inv.invokeFunction("hello", "Scripting" );
System.out.println("res:"+res);
}
public static void testScriptInterface(ScriptEngine engine) throws ScriptException{
String script = "var obj = new Object(); obj.run = function() { println('run method called'); }";
engine.eval(script);
Object obj = engine.get("obj");
Invocable inv = (Invocable) engine;
Runnable r = inv.getInterface(obj,Runnable.class);
Thread th = new Thread(r);
th.start();
}
public static void testUsingJDKClasses(ScriptEngine engine) throws Exception{
//Packages是脚本语言里的一个全局变量,专用于访问JDK的package
String js = "function doSwing(t){var f=new Packages.javax.swing.JFrame(t);f.setSize(400,300);f.setVisible(true);}";
engine.eval(js);
Invocable inv = (Invocable) engine;
inv.invokeFunction("doSwing", "Scripting Swing" );
}
}
Scripting Tool
--------------------------------------------------------------------------------
SUN提供的JDK6中有一个命令行工具——jrunscript,你可以在<JDK6_Home>/bin下面找到这个工具,jrunscript是一个脚本语言的解释程序,它独立于脚本语言,但默认是用JavaScript,我们可以用jrunscript来测试自己写的脚本语言是否正确,下面是一个在命令行运行jrunscript的简单例子
jrunscript
js>println("Hello,JrunScript");
Hello,JrunScript
js>9*8
72.0
js>
分享到:
相关推荐
呈现在: ( ) 纽约QCon(2014年6月) ( 幻灯片) 内容: 在线查看幻灯片PDF幻灯片(最新版本) 演示文稿( 1080p视频,幻灯片和旁白) 二手技术数据库Dust.JS(LinkedIn分支) 抗体JDK8 Java平台的脚本API 如何...
本文档是 JavaTM Platform Standard Edition 6 的 API 规范。 Java SE Platform 软件包 java.applet 提供创建 applet 所必需的类和 applet 用来与其 applet 上下文通信的类。 java.awt 包含用于创建用户界面和绘制...
Nashorn脚本API片段 如果您在Java 8上运行AEM 6.1(或SP2或6.0),则可能要使用新的Nashorn JavaScript引擎来完成服务器端JS方面的工作。 不幸的是,即使nashorn.jar在系统类路径中,您也无法-OSGi容器中的捆绑包...
java.compiler,java.management,java.naming,jdk.naming.dns,java.datatransfer,java.desktop,java.logging,java.prefs,java.scripting,java.xml,javafx.base,javafx.controls,javafx.fxml,javafx.graphics,jdk....
12.3.2 脚本元素(scripting elements) 374 12.3.3 动作元素(action elements) 376 12.3.4 注释 383 12.4 jsp的隐含对象 383 12.4.1 pagecontext 384 12.4.2 out 385 12.4.3 page 385 12.4.4 exception ...
12.3.2 脚本元素(scripting elements) 374 12.3.3 动作元素(action elements) 376 12.3.4 注释 383 12.4 jsp的隐含对象 383 12.4.1 pagecontext 384 12.4.2 out 385 12.4.3 page 385 12.4.4 exception ...
12.3.2 脚本元素(scripting elements) 374 12.3.3 动作元素(action elements) 376 12.3.4 注释 383 12.4 jsp的隐含对象 383 12.4.1 pagecontext 384 12.4.2 out 385 12.4.3 page 385 12.4.4 exception ...
12.3.2 脚本元素(scripting elements) 374 12.3.3 动作元素(action elements) 376 12.3.4 注释 383 12.4 jsp的隐含对象 383 12.4.1 pagecontext 384 12.4.2 out 385 12.4.3 page 385 12.4.4 exception ...
java.lang.annotation 为 Java 编程语言注释设施提供库支持。 java.lang.instrument 提供允许 Java 编程语言代理检测运行在 JVM 上的程序的服务。 java.lang.management 提供管理接口,用于监视和管理 Java 虚拟机...
scripted language BSF框架支持的脚本语言名称(BSF为apache项目) scripted script 返回远程对象的脚本,脚本可以指定一些属性,多数情况下一般只设置param节点配置.属性很少设置. spring Location* 任何以location开头...