快速业务通道

Java SE 6新特性: 对脚本语言的支持 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-19
供了两个函数 invokeFunction 和 invokeMethod,分别允许 Java 应用程序直接调用脚本中的一个全局性的过程以及对象中的方法,调用后者时,除了指定函数名字和参数外,还需要传入要调用的对象引用,当然这需要脚本引擎的支持。不仅如此,Invocable 接口还允许 Java 应用程序从这些函数中直接返回一个接口,通过这个接口实例来调用脚本中的函数或方法,从而我们可以从脚本中动态的生成 Java 应用中需要的接口对象。清单 5 演示了如何使用一个 Invocable 接口:

清单 5. 调用脚本中的函数

import javax.script.*; public class CompilableTest {   public static void main(String[] args) throws ScriptException,       NoSuchMethodException {     String script = " function greeting(message){println (message);}";     ScriptEngineManager manager = new ScriptEngineManager();     ScriptEngine engine = manager.getEngineByName("javascript");     engine.eval(script);     if (engine instanceof Invocable) {       Invocable invocable = (Invocable) engine;       invocable.invokeFunction("greeting", "hi");       // It may through NoSuchMethodException       try {         invocable.invokeFunction("nogreeing");       } catch (NoSuchMethodException e) {         // expected       }     }   } }

在调用函数前,可以先通过 instanceof 操作判断脚本引擎是否支持编译操作,防止类型转换时抛出运行时异常,需要特别注意的时,如果调用了脚本程序中不存在的函数时,运行时会抛出一个 NoSuchMethodException 的异常,实际开发中应该注意处理这种特殊情况。

Java SE 6新特性: 对脚本语言的支持(7)

时间:2011-02-15 IBM 邱小侠

Compilable 接口

一般来说,脚本语言都是解释型的,这也是脚本语言区别与编译语言的一个特点,解释性意味着脚本随时可以被运行,开发者可以边开发边查看接口,从而省去了编译这个环节,提供了开发效率。但是这也是一把双刃剑,当脚本规模变大,重复解释一段稳定的代码又会带来运行时的开销。有些脚本引擎支持将脚本运行编译成某种中间形式,这取决与脚本语言的性质以及脚本引擎的实现,可以是一些操作码,甚至是 Java 字节码文件。实现了这个接口的脚本引擎能把输入的脚本预编译并缓存,从而提高多次运行相同脚本的效率。

Java 脚本 API 还为这个中间形式提供了一个专门的类,每次调用 Compilable 接口的编译函数都会返回一个 CompiledScript 实例。CompiledScript 类被用来保存编译的结果,从而能重复调用脚本而没有重复解释的开销,实际效率提高的多少取决于中间形式的彻底程度,其中间形式越接近低级语言,提高的效率就越高。每一个 CompiledScript 实例对应于一个脚本引擎实例,一个脚本引擎实例可以含有多个 CompiledScript(这很容易理解),调用 CompiledScript 的 eval 函数会传递给这个关联的 ScriptEngine 的 eval 函数。关于 CompiledScript 类需要注意的是,它运行时对与之对应的 ScriptEngine 状态的改变可能会传递给下一次调用,造成运行结果的不一致。清单 6 演示了如何使用 Compiable 接口来调用脚本:

清单 6. 编译脚本

import javax.script.*; public class CompilableTest {   public static void main(String[] args) throws ScriptException {     String script = " println (greeting); greeting= ''Good Afternoon!'' ";     ScriptEngineManager manager = new

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号