Java SE 6之脚本引擎 让程序如虎添翼

java脚本引擎Groovy实战 ​互联网时代随着业务的飞速发展,不仅产品迭代、更新的速度越来越快,个性化需求也是越来越多。如何快速的满足各种业务的个性化需求是我们要重点思考的问题。我们开发的系统如何才能做到热部署就能适应各种规则变化呢?实现业务和规则的解耦。 好了,Java的ScriptEngine脚本引擎给了我们一个选择,它支持代码动态执行,代码修改后不需要重启JVM进程,就可以使用解析或编译方式执行,非常方便,在一些动态业务规则、热更新、热修复等场景中会非常方便。 阅读详情
<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> 现在Java SE 5已经发布,在明年Java SE 6也将发布。Java SE 6较Java SE5有了很大的改进,它的功能更强,而且是专为Vista所设计,这就意味着Java SE 6将是Vista上的最佳选择。而Java SE 6所提供的最众多的新功能必将成为它的最大卖点。   Java SE 6最引人注目的新功能之一就是内嵌了脚本支持。在默认情况下,Java SE 6只支持JavaScript,但这并不以为着Java SE 6只能支持JavaScript。在Java SE 6中提供了一些接口来定义一个脚本规范,也就是JSR223。通过实现这些接口,Java SE 6可以支持任意的脚本语言(如PHP或Ruby)。   运行第一个脚本程序   在使用Java SE 6运行脚本之前,必须要知道你的Java SE 6支持什么脚本语言。在javax.script包中有很多的类,但这些类中最主要的是ScriptEngineManager。可以通过这个类得到当前Java SE 6所支持的所有脚本。如下面例子将列出所有可以使用的脚本引擎工厂。 import javax.script.*; import java.io.*; import java.util.*; import static java.lang.System.*; public class ListScriptEngines {  public static void main(String args[])  {   ScriptEngineManager manager = new ScriptEngineManager();   // 得到所有的脚本引擎工厂   List factories = manager.getEngineFactories();   // 这是Java SE 5 和Java SE 6的新For语句语法   for (ScriptEngineFactory factory: factories)   {    // 打印脚本信息    out.printf("Name: %s%n"     "Version: %s%n"     "Language name: %s%n"     "Language version: %s%n"     "Extensions: %s%n"     "Mime types: %s%n"     "Names: %s%n",     factory.getEngineName(),     factory.getEngineVersion(),     factory.getLanguageName(),     factory.getLanguageVersion(),     factory.getExtensions(),     factory.getMimeTypes(),     factory.getNames());    // 得到当前的脚本引擎    ScriptEngine engine = factory.getScriptEngine();   }  } }   上面的例子必须要在Java SE 6中编译。其中import static java.lang.System.*是新的语法,将System中的所有静态成员进行引用,以后就可以直接使用out、in或err了。   通过运行java ListScriptEngines,将显示如下信息 Name: Mozilla Rhino Version: 1.6 release 2 Language name: ECMAScript Language version: 1.6 Extensions: [js] Mime types: [application/javascript, application/ecmascript, text/javascript, text/ecmascript] Names: [js, rhino, JavaScript, javascript, ECMAScript, ecmascript]   在最下面一行是脚本的别名,也就是使用它们中的任意一个都可以。得到一个具体的脚本引擎有3种方法。   ·根据扩展名得到脚本引擎 ScriptEngine engine = manager.getEngineByExtension("js");   getEngineByExtension的参数就是Extensions:[js]中[…]里的部分。   ·根据Mime类型得到脚本引擎 ScriptEngine engine = manager.getEngineByMimeType("text/javascript");   getEngineByMimeType的参数可以是Mime types: [application/javascript, application/ecmascript, text/javascript, text/ecmascript]中的任何一个,可以将text/javascript改成text/ecmascript。   ·根据名称得到脚本引擎 ScriptEngine engine = manager.getEngineByName("javascript");   getEngineByName后的参数可以是Names: [js, rhino, JavaScript, javascript, ECMAScript, ecmascript]中的任何一个,如可以将javascript改成ecmascript。   上面已经讨论了执行脚本的第一步,就是得到一个可用的脚本引擎。在完成这项工作之 后就可以利用这个脚本引擎执行相应的脚本了。我们可以使用ScriptEngine的eval方法来执行脚本。eval方法被重载的多次,但最常用的是public Object eval(String script)。 下面的例子演示了如何使用eval方法来执行javascript脚本。 import javax.script.*; import java.io.*; import static java.lang.System.*; public class FirstJavaScript {  public static void main(String args[])  {   ScriptEngineManager manager = new ScriptEngineManager();   // 得到javascript脚本引擎   ScriptEngine engine = manager.getEngineByName("javascript");   try   {    // 开始运行脚本,并返回当前的小时    Double hour = (Double)engine.eval("var date = new Date();" "date.getHours();");    String msg;    // 将小时转换为问候信息    if (hour < 10)    {     msg = "上午好";    }    else if (hour < 16)    {     msg = "下午好";    }    else if (hour < 20)    {     msg = "晚上好";    }    else    {     msg = "晚安";    }    out.printf("小时 %s: %s%n", hour, msg);   }   catch (ScriptException e)   {    err.println(e);   }  } }   上面的例子通过得到当前的小时,并将其转化为问候语。上面的程序的输出信息为:   小时9.0:上午好   这个例子最值得注意的是执行的2句脚本,最后一句是date.getHours()。并未将这个值赋给一个javascript变量。这时,eval方法就将这样的值返回。这有些类似C语言的(…)运算符。如(c=a b, c d),这个表达式的返回值是a b d。 和脚本语言进行交互   上面例子只是运行了一个非常简单的脚本。这个脚本是孤立的,并未通过Java向这脚本传递任何的值。虽然从这个脚本返回了一个值,但这种返回方式是隐式的。   脚本引擎除了这些简单的功能,还为我们提供了更强大的功能。甚至可以通过Java向脚本语言中传递参数,还可以将脚本语言中的变量的值取出来。这些功能要依靠ScriptEngine中的两个方法put和get。   put 有两个参数,一个是脚本变量名,另一个是变量的值,这个值是Object类型,因此,可以传递任何值。   get 有一个参数,就是脚本变量的名。   下面的代码通过javascript脚本将一个字符串翻转(这个字符串是通过java传给javascript的),然后通过java得到这个被翻转后的字符后,然后输出。 import javax.script.*; import java.io.*; import static java.lang.System.*; public class ReverseString {  public static void main(String args[])  {   ScriptEngineManager manager = new ScriptEngineManager();   // 建立javascript脚本引擎   ScriptEngine engine = manager.getEngineByName("javascript");   try   {    // 将变量name和变量值abcdefg传给javascript脚本    engine.put("name", "abcdefg");    // 开始执行脚本    engine.eval("var output = ;"     "for (i = 0; i <= name.length; i ) {"     " output = name.charAt(i) output"     "}");    // 得到output变量的值    String name = (String)engine.get("output");    out.printf("被翻转后的字符串:%s", name);   }   catch (ScriptException e)   {    err.println(e);   }  } }   以上代码的输出结果为:被翻转后的字符串:gfedcba 让脚本运行得更快   众所周知,解释运行方式是最慢的运行方式。上述的几个例子无一例外地都是以解释方式运行的。由于Java EE 6的脚本引擎可以支持任何实现脚本引擎接口的语言。有很多这样的语言提供了编译功能,也就是说,在运行脚本之前要先将这些脚本进行编译(这里的编译一般将不是生成可执行文件,而只是在内存中编译成更容易运行的方式),然后再执行。如果某段脚本要运行之交多次的话,使用这种方式是非常快的。我们可以使用ScriptEngine的compile方法进行编译。并不是所有脚本引擎都支持编译,只有实现了Compilable接口的脚本引擎才可以使用compile进行编译,否则将抛出一个错误。下面的例子将演示如何使用compile方法编译并运行javascript脚本。 import javax.script.*; import java.io.*; import static java.lang.System.*; public class CompileScript {  public static void main(String args[])  {   ScriptEngineManager manager = new ScriptEngineManager();   ScriptEngine engine = manager.getEngineByName("javascript");   engine.put("counter", 0); // 向javascript传递一个参数   // 判断这个脚本引擎是否支持编译功能   if (engine instanceof Compilable)   {    Compilable compEngine = (Compilable)engine;    try    {     // 进行编译     CompiledScript script = compEngine.compile("function count() { "      " counter = counter 1; "      " return counter; "     "}; count();");     out.printf("Counter: %s%n", script.eval());     out.printf("Counter: %s%n", script.eval());     out.printf("Counter: %s%n", script.eval());    }    catch (ScriptException e)    {     err.println(e);    }   }   else   {    err.println("这个脚本引擎不支持编译!");   }  } }   上面的代码运行后的显示信息如下:   Counter: 1.0   Counter: 2.0   Counter: 3.0   在这个例子中,先通过compile方法将脚本编译,然后通过eval方法多次进行调用。在这段代码中只有一个函数,因此,eval就返回了这个函数的值。 动态调用脚本语言的方法   上面的例子只有一个函数,可以通过eval进行调用并将它的值返回。但如果脚本中有多个函数或想通过用户的输入来决定调用哪个函数,这就需要使用invoke方法进行动态调用。和编译一样,脚本引擎必须实现Invocable接口才可以动态调用脚本语言中的方法。下面的例子将演示如何通过动态调用的方式来运行上面的翻转字符串的javascript脚本。 import javax.script.*; import java.io.*; import static java.lang.System.*; public class InvocableTest {  public static void main(String args[])  {   ScriptEngineManager manager = new ScriptEngineManager();   ScriptEngine engine = manager.getEngineByName("javascript");   if (engine instanceof Invocable)   {    try    {     engine.eval("function reverse(name) {"      " var output = ;"      " for (i = 0; i <= name.length; i ) {"       " output = name.charAt(i) output"        " } return output;}");     Invocable invokeEngine = (Invocable)engine;     Object o = invokeEngine.invoke("reverse", name);     out.printf("翻转后的字符串:%s", name);    }    catch (NoSuchMethodException e)    {     err.println(e);    }    catch (ScriptException e)    {     err.println(e);    }   }   else   {    err.println("这个脚本引擎不支持动态调用");   } } 动态实现接口   脚本引擎还有一个更吸引的功能,那就是动态实现接口。如我们要想让脚本异步地执行,即通过多线程来执行,那InvokeEngine类必须实现Runnable接口才可以通过Thread启动多线程。因此,可以通过getInterface方法来使InvokeEngine动态地实现Runnable接口。这样一般可分为3步进行。   1. 使用javascript编写一个run函数 engine.eval("function run() {print(异步执行);}");   2. 通过getInterface方法实现Runnable接口 Runnable runner = invokeEngine.getInterface(Runnable.class);   3. 使用Thread类启动多线程 Thread t = new Thread(runner); t.start();   下面是实现这个功能的详细代码。 import javax.script.*; import static java.lang.System.*; public class InterfaceTest {  public static void main(String args[])  {   ScriptEngineManager manager = new ScriptEngineManager();   ScriptEngine engine = manager.getEngineByName("javascript");   try   {    engine.eval("function run() {print(异步调用);}");    Invocable invokeEngine = (Invocable)engine;    Runnable runner = invokeEngine.getInterface(Runnable.class);    Thread t = new Thread(runner);    t.start();    t.join();   }   catch (InterruptedException e)   {    err.println(e);   }   catch (ScriptException e)   {    System.err.println(e);   }  } }   其实上面的代码是通过javascript实现了Runnable接口的run方法。
USB2.0学习1--基本概念 USB全称是 Universal Serial Bus,即通用串行总线,是一种计算机与外围设备进行数据交互的串行通信标准。USB协议是在1994年底由英特尔、IBM、Microsoft等公司联合提出的,现由USB协会(USB-IF)管理。USB使用差分信号来传输数据,具有传输速度快、支持热插拔、连接灵活、独立供电、协议向下兼容等优点,目前应用十分广泛。 阅读详情

相关推荐

Vue项目实战:海康WebControl插件从安装到预览功能全流程(附RSA加密避坑指南)

本文详细介绍了在Vue项目中集成海康威视WebControl插件的全流程,从环境准备、插件部署到核心功能实现。重点解析了使用JS_RequestInterface获取RSA公钥并进行加密参数初始化的关键步骤与常见避坑指南,帮助开发者高效完成监控视频预览功能的开发与调试。

linux6sysadmin的博客 1228

java基本框架ssg_Java SE 6之脚本引擎 让程序如虎添翼-ssgemail@126.com -Java...

现在JavaSE5已经发布,在明年JavaSE6也将发布。JavaSE6较JavaSE5有了很大的改进,它的功能更强,而且是专为Vista所设计,这就意味着JavaSE6将是Vista上的最佳选择。而JavaSE6所提供的最众多的新功能必将成为它的最大卖点。JavaSE6最引人注目的新功能之一就是内嵌了脚本支持。在默认情况下,JavaSE6只支持JavaScript,...

weixin_33266645的博客 381

YOLOv8冻结层的迁移学习 全网首发

在调用时会创建trainer此时的模型配置更新了,冻结了个p。

qq_42693842的博客 6587

java 脚本引擎性能_Java SE 6 入门之脚本引擎加大程序性能

Java SE 6 入门之脚本引擎加大程序性能Java SE 6较Java SE5有了很大的改进,它的性能更强,而且是专为Vista所设计,这就象征着Java SE 6将是Vista上的最佳抉择。而Java SE 6所提供的最泛滥的新性能必将成为它的最大卖点。Java SE 6最有目共睹的新性能之一就是内嵌了脚本支持。在默许情况下,Java SE 6只支持JavaScript,但这并不认为着Jav...

weixin_42489714的博客 242

ORB-SLAM3在windows11下的编译使用

近期在学习SLAM,想部署一下ORB-SLAM3,但是自己电脑是win11系统,因此就想着在win11上部署一下。但是网上看了一些教程,有一些博客,但是可能不适合我这种情况把,就很纠结。先说下结果,配置成功,过程极其痛苦。

weixin_44457768的博客 6097

告别License烦恼:手把手教你用VS Code+Cppcheck搭建免费的MISRA-C代码检查环境

本文详细介绍了如何使用VS Code和开源工具Cppcheck搭建免费的MISRA-C代码检查环境,帮助开发者规避商业工具的高额License费用。通过四步环境搭建和实战技巧,实现高效的代码静态检查,提升嵌入式开发的安全性和可靠性。

weixin_42523326的博客 248

java脚本引擎_Java SE 6之脚本引擎

现在Java SE 5已经发布,在明年Java SE 6也将发布。Java SE 6较Java SE5有了很大的改进,它的功能更强,而且是专为Vista所设计,这就意味着Java SE 6将是Vista上的最佳选择。而Java SE 6所提供的最众多的新功能必将成为它的最大卖点。Java SE 6最引人注目的新功能之一就是内嵌了脚本支持。在默认情况下,Java SE 6只支持JavaScript,...

weixin_32389427的博客 387

电机控制基础,小白入门篇

电机,这个藏在风扇、电动车、机器人里的“动力心脏”,如何精准控制它的转速、方向甚至力量?这篇博客专为完全零基础的小白打造,用“说人话”的方式拆解电机控制的底层逻辑,帮你从“看不懂电路图”到“能调个简单电机”。 电机控制不是“大神专属”,只要掌握“电生磁、磁生力”的底层逻辑,加上动手实践,小白也能快速入门。这篇博客会陪你从“看电机转”到“让电机听话”,把复杂的控制原理变成能上手玩的“小实验”。准备好你的面包板和电机,我们一起开启“电控之旅”吧!

汽车电子软件领域知识分享 5620

Java SE 6概述--对脚本语言的支持

2006 年底,Sun 公司发布了 Java Standard Edition 6(Java SE 6)的最终正式版,代号 Mustang(野马)。跟 Tiger(Java SE 5)相比,Mustang 在性能方面有了不错的提升。与 Tiger 在 API 库方面的大幅度加强相比,虽然 Mustang 在 API 库方面的新特性显得不太多,但是也提供了许多实用和方便的功能:在脚本,WebServ

bingouu的专栏 1052

Android15音频进阶之解underrun与overrun思路(一百一十七)

本篇目的:Android15音频进阶之解underrun与overrun思路Underrun:发生在播放:APP准备的数据太少,导致底层没有音频数据可以播放,导致ADSP被“饿死了“,即Underrun。Overrun: 发声在录音:APP录音数据获取太慢了,导致底层录出来的数据太多了,APP播放不了,导致APP被“撑死了”,即Overrun。

Android系统攻城狮 2108

SAP生产订单技术性完成(TECO)操作指南与实战应用

生产订单技术关闭操作指南主要包括单笔和批量关闭两种方式,通过CO02/COHV事务码完成。

m0_47402127的博客 1932

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

2006 年底,Sun 公司发布了 Java Standard Edition 6(Java SE 6)的最终正式版,代号 Mustang(野马)。跟 Tiger(Java SE 5)相比,Mustang 在性能方面有了不错的提升。与 Tiger 在 API 库方面的大幅度加强相比,虽然 Mustang 在 API 库方面的新特性显得不太多,但是也提供了许多实用和方便的功能:在脚本

翔的窝窝 684

AMDGPU IH(Interrupt Handler)实现分析

AMDGPU IH环形缓冲区机制是显卡驱动中高效处理GPU硬件中断的核心架构。该机制通过环形缓冲区存储中断事件,利用读写指针(wptr/rptr)同步硬件与驱动间的数据交互。硬件写入事件后驱动遍历处理,通过指针掩码实现环形循环,并具备溢出检测和虚拟化环境下的重置保护。其优势在于批量处理降低中断开销,指针同步确保可靠性,支持多队列扩展和SR-IOV虚拟化场景,为GPU中断管理提供了高性能基础架构。

图形/计算GPU的驱动与虚拟化技术分享园地 1640

JavaSE 6之脚本引擎让程序如虎添翼

Java SE 6最引人注目的新功能之一就是内嵌了脚本支持。在默认情况下,Java SE 6只支持JavaScript,但这并不以为着Java SE 6只能支持JavaScript。在Java SE 6中提供了一些接口来定义一个脚本规范,也就是JSR223。通过实现这些接口,Ja

807

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Java SE 6 的新特性

Java SE 6 的新特性SUN公司表示,新的Java SE 6的成功发布,要归功于长达两年多的全行业范围内的通力研发合作。这种“通力的研发合作”包括了开放式的软件测评,每周一发的新测试版本,以及在SUN公司的内部工程师们和超过330名外部软件研发者之间的广泛而深远的协作。新的Java SE 6也为我们带来了新的 JSR 270 标准,也就是以前所说的针对Java SE 6平

CJY之旅 1619

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

给Java SE 注入脚本语言的活力

 在即将发布的 Java SE6(Mustang)中,增加了对脚本语言的支持。通过对脚本语言的调用,使得一些通常用 Java 比较难于实现的功能变得简单和轻便。脚本语言与 Java 之间的互操作将变得优雅而直接。脚本语言与 Java假设我们有一个简单的需求,察看一份文档中 5 个字母组成的单词的个数。用 Java 一般实现如下:import java.io.BufferedReader; im

阿布客栈 2977

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Java SE 6 对脚本语言的支持

Java 脚本 API 概述 脚本引擎 脚本引擎

cuiyanws的专栏 707

java脚本_Java SE 6 新特性

Java SE 6 新特性对脚本语言的支持邱 小侠2007 年 9 月 28 日发布系列内容:此内容是该系列 # 部分中的第 # 部分: Java SE 6 新特性http://www.ibm.com/developerworks/cn/java/j-lo-jse6/敬请期待该系列的后续内容。此内容是该系列的一部分:Java SE 6 新特性敬请期待该系列的后续内容。Java 脚本 API 概述脚...

weixin_28993311的博客 220

Java SE 6入门之脚本引擎加大程序功能

Java SE 6比Java SE 5有了很大的改进,它的功能更强,而且是专为Vista所设计,这就意味着Java SE 6将是Vista上的最佳选择。而Java SE 6所提供的最众多的新功能必将成为它的最大卖点。 Java SE 6最引人注目的新功能之一就是内嵌了脚本支持。在默认情况下,Java SE6只支持JavaScript,但这并不以为着Java SE 6只能支持JavaScript。在

塞翁失马 1038

Java SE 6 新特性: 对脚本语言的支持 [VERY GOOD]

Java SE 6 新特性: 对脚本语言的支持 [VERY GOOD] Java SE 6 新特性: 对脚本语言的支持Java SE 6 新特性: 对脚本语言的支持邱 小侠 (qiuxiaox@cn.ibm.com), 软件工程师, IBM邱小侠,目前就职于 IB...

133

java执行js脚本_java调用JavaScript脚本

Java SE 6最引人注目的新功能之一就是内嵌了脚本支持。在默认情况下,Java SE 6只支持JavaScript,但这并不以为着Java SE 6只能支持JavaScript。在Java SE 6中提供了一些接口来定义一个脚本规范,也就是JSR223。通过实现这些接口,Java SE 6可以支持任意的脚本语言(如PHP或Ruby)。运行第一个脚本程序在使用Java SE 6运行脚本之前,必须...

weixin_39974932的博客 618
上一篇: Java基于GPL开源且免费 有助Linux发展
下一篇: 经典:Java及相关字符集编码问题研究
java169
博客等级 码龄19年 27粉丝 2568原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值