概述


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 1ScriptEngine 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>

JDK6的新特性之十二:脚本语言支持(Scripting)相关推荐

  1. C++ 11 新特性(十二)函数新特性、内联函数、const详解

    函数后置返回类型 //后置返回类型 auto fun(int, int)->int; 内联函数 在函数定义前增加关键字 inline ,使得该函数变成内联函数 (1) 适用于函数体很小,调用很频 ...

  2. C++新特性探究(十二):static_assert(提前判误)

    相关博文:C++之异常处理探究 相关博文:assert.if else.try catch三者的区别 相关博文:C++之assert.NDEBUG探究 相关博文:static_assert和asser ...

  3. C++新特性探究(十六):move constructor移动构造

    相关博文: C++新特性探究(十三):右值引用(r-value ref)&&探究 C++新特性探究(十六):move constructor移动构造 C++新特性探究(13.5):右值 ...

  4. C++新特性探究(十五):bind

    相关博文:C++新特性探究(十四):function 相关博文:C++头文件<functional>和bind.placeholders占位符使用简单例子 相关博文:<Essenti ...

  5. C++新特性探究(十四):function

    相关博文:C++头文件<functional>和bind.placeholders占位符使用简单例子 相关博文:<Essential C++>笔记之设计一个泛型算法(二) 相关 ...

  6. Java 8新特性探究(二)深入解析默认方法

    转载自 Java 8新特性探究(二)深入解析默认方法 什么是默认方法,为什么要有默认方法 简单说,就是接口可以有实现方法,而且不需要实现类去实现其方法.只需在方法名前面加个default关键字即可. ...

  7. Java7 一些新特性及脚本语言支持API--笔记

    1.switch条件语句中可以加入字符串了,实现方法是利用了字符串的hashcode()值作业真正的值 2.增加了一种可以在字面量中使用的进制,二进制,通过在数字前面加"0b"或& ...

  8. IT职场人生系列之十二:语言与技术I

    本文是IT职场人生系列的第十二篇. 最近移动互联网很流行,很多人都在学习IOS.Android编程.这也引起一个入行.改行的潮流. 那么,作为新手.老手,应该怎样选择自己学习的语言和技术呢? 本人从早 ...

  9. 价值4500的国际版多语言点赞抖音分享点赞任务平台源码(十二种语言)

    介绍: 平台会员分享给我的,他自己搭建成功了,测试可用!我就不测试了,需要的拿! 九种语言 :西班牙语,泰语.日语,印度尼西亚语言.越南语言.英文.繁体中文,简体中文,印度语 前台支持更换5种颜色风格 ...

最新文章

  1. 背景图自适应屏幕居中显示,且不变形
  2. OpenCV霍夫变换:霍夫线变换,霍夫圆变换合辑
  3. CSDN专家分和博客系统积分获得规则!
  4. Zabbix监控,详细部署
  5. 决策树-熵计算-ID3算法(转)
  6. c 语言差错编码实验结果,C语言程序设计实验报告(四).doc11111111111111111.doc
  7. require.js的笔记
  8. MySQL------如何将SQLServer文件数据迁移到MySQL
  9. 本地上传文件到FastDFS命令上传报错:ERROR - file: connection_pool.c, line: 142, connect to server 192.168.0.197:221
  10. Java——面向对象三大特性学习笔记
  11. ArcEngine创建IFeature的三种方法
  12. 用WAIK for Win7制作Winpe3.0
  13. 双击java安装包没反应_wps安装包双击没反应
  14. 农用地包括哪些地类_设施农用地属于什么地类、包括哪些用地?
  15. Excel中绘制斜线表头
  16. mysql数据库的简单查询一般是查询什么,MySQL的简单查询语句(十五)
  17. springboot引入validation
  18. 7、HTML超链接标签,a标签,锚链接,QQ推广
  19. 符号常量和常变量的区别
  20. python 语料_用python从语料库中提取最常用的词

热门文章

  1. mysql着重号_MySQL-基础篇语法笔记
  2. web-RPC之sekiro
  3. 抖音创作规范_抖音运营内容规范,以及十五条运营经验
  4. 光学设计手册学习(一)——望远镜系统
  5. 3D建模初学者必学运算操作
  6. weex实现滚动条和导航栏联动
  7. 什么人不在生死簿_人在做,天在看:阎王爷“生死簿”上到底写了什么?
  8. 小白学习Flink系列--第二篇-01(流式数据概念)
  9. 为什么需要自动化测试?自动化有哪些优势?
  10. 京东面试:说说你对ByteBuf的理解