- 浏览: 459307 次
- 性别:
- 来自: 湖南
-
最新评论
-
okhaoba:
show log 后可以在change history lis ...
如何把修改过的文件通过svn导出 -
XDKS59:
博主 我是用ssm写的不知道后台该怎么写 能帮帮我吗
fullCalendar制作一款简单的日历日程 -
会飞的鸭子20125:
很有帮助,谢谢
struts1的bean标签库 -
zxjlwt:
学习了素人派http://surenpi.com
Velocity的基本用法 -
spring_springmvc:
如何在java Web项目中开发WebService接口,地址 ...
Webservice接口开发简单例子
深入浅出Rhino:Java与JS互操作
2011年11月11日00:00 it168网站原创 作者:DoubleLife 编辑:皮丽华 评论:0条
【IT168 专稿】2011年10月6日,一年一度的JavaOne大会隆重举行。JavaOne2011大会的主题之一介绍针对不同Java平台的产品路线图,这其中包括移动版(ME,Micro Edition)、标准版(SE,Standard Edition)以及企业版(EE,Enterprise Edition)。
Java SE的亮点之一就是Oracle详细阐述Java SE 8路线图。我们先来看看Java SE 8新增了哪些主要功能:
Java SE 8 新增主要功能
1、为提高开发人员工作效率,更好地利用多核处理器和增强对Java集合APIs的大容量数据处理功能,推出的Lambda表达式(“关闭”)。
2、原始Java模块系统(“项目Jigsaw”)将简化应用程序的构建、包装以及部署,让一个完全模块化的Java平台能在服务器、客户和嵌入式系统上进行定制化部署。
3、在JVM上的JavaScript改进,包括一个为JVM优化的全新JavaScript引擎Nashorn和全面的Java / JavaScript互操作性。
4、具有JavaFX 3.0形式的下一代Java客户端。包括多点触摸功能的现代设备支持。
5、完成的HotSpot / JRockit JVM集聚项目,包括性能增强和第二代的Java Flight Recorder。
其中,笔者最关心的是第三条,即JVM对JavaScript的改进。它的核心组件是JavaScript引擎Nashorn,它实现了Java与JavaScript互操作性。Nashorn一词与Rhino类似,汉语意思均为犀牛。而巧合的是,Rhino就是JavaScript引擎,它的目的就是实现Java与JavaScript的互操作性。那么Rhino究竟是什么呢?为什么说Nashorn是新一代JavaScript引擎?Rhino有什么特性?Rhino与Java及JavaScript有什么关系呢?本文将会为您一一解答。
什么是Rhino?
Rhino 是 JavaScript 的一种基于Java的实现,原先由Mozilla开发,现在被集成进入JDK 6.0。下面这两行代码恰好说明了这一点。
import sun.org.mozilla.javascript.internal.Context;
import sun.org.mozilla.javascript.internal.Scriptable;
Rhino汉语意思为犀牛,它的名字来源于 O'Reilly 关于 JavaScript 的书的封面,如图一所示。
图一 “犀牛“的来源
Rhino的特点如下:
JavaScript 1.5的全部特性
允许使用脚本直接操作Java
提供JavaScript Shell执行其它JavaScript脚本
提供JavaScript编译器将JavaScript源程序转换成Java类文件
Rhino相关背景
Rhino的历史可追溯到1997 年。Netscape计划开发Java版的Navigator,即Javagator。它也就是 Rhino 的前身。虽然 Javagator 未能开花结果,但是Rhino,作为Netscape 对 JavaScript 的移植语言,经过时间考验存活了下来。
如今,随着 Rhino 开放源代码,越来越多的开发者参与了 Rhino 的开发。随着Rhino的愈加成熟,越来越多的用户选择使用了Rhino。
Rhino语言特点
Java是一种面对对象的编译型语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码,从而实现了“一次编译、到处执行”的跨平台特性。
JavaScript是一种动态、弱类型、基于原型的客户端脚本语言。JavaScript 包括一个基于对象的 API,称为文档对象模型(Document Object Model)或 DOM,用以访问和操作 Web 页面的内容,给HTML网页添加动态功能。
Rhino是一个介于Java与JavaScript之间的语言。它的基础是 Java 语言,这使得它简单易学,但相比于JavaScript脚本语言来说,它又太过复杂。不过,Rhino 的主要缺点也正是它的强大之处,Rhino 是一种轻量级的、功能强大的脚本语言。Rhino 使用原型而不是类,这使它比很多脚本语言更适合开发 GUI 应用程序,在考虑性能和风格等因素时更是如此。
Rhino语言特点的优缺点
一方面,作为一种动态类型的、基于原型的脚本语言,Rhino借用了很多JavaScript语法。比如,Rhino不再使用语句结束符( ; ),放宽了变量声明规则,并且极大地简化了修改和检索对象属性的语法。另一方面,作为JavaScript 的Java实现,Rhino语法非常类似于Java编程语言。比如,Rhino采用了与 Java 编程语言相似的循环和条件结构,并且遵循类似的语法模式来表示这些结构。
Rhino 和 Java 语言之间有一些显著的区别。Rhino 是一种基于原型的(prototype-based)语言,而不是一种基于类的(class-based)语言。Rhino中,函数和变量的声明中看不到类型,取而代之的是,使用 function关键字声明函数,使用 var关键字声明局部变量。
Rhino的原始想法是将JavaScript 编译成Java字节码执行,即采用编译执行的方式。由于由于JVM存在垃圾收集、编译和装载过程的开销过大等限制,Rhino采用了解释执行的方式。
如何下载Rhino安装包
用户可以从官网http://www.mozilla.org/rhino/ 下载Rhino,笔者下载的版本为rhino1.7R3.zip。
其中,主要的目录与文件的如下:
Src:Rhino相关Jar包对应的源代码
Javadoc:Rhino相关Jar包对应的Java说明文档
Examples:Rhino相关示例
build.xml:Rhino工程对应的Ant文件
js.jar:Rhino对应的Jar包
【IT168 专稿】Rhino环境配置
在使用之前,我们需要配置环境及运行js脚本。具体如下:
1、 将下载包中的js.jar文件加入系统CLASSPATH中。
2、 运行js解释器java org.mozilla.javascript.tools.shell.Main。进入交互模式:
Rhino 1.7 release 3 2011 05 09
js>
注:第一行为js解释器的版本号,后面跟着提示符 js>
下面我们将利用js shell,使用JavaScript操纵Java对象。
JavaScript操纵Java对象
1. Rhino如何访问Java包与类文件
Java语法规定,任何代码都必须以class文件的形式存在,而每个class文件必须属于一个package,默认为default。而JavaScript并没有类似package的层级结构概念,那么如何使用Rhino访问Java类文件呢?
Rhino定义了一个top-level变量Packages。变量Packages对应的所有属性均对应Java包名。比如,我们需要访问某一个Java的Package com.example.
js> Packages.com.example
[JavaPackage com.example]
简单起见,我们也可以去掉变量Packages,直接输入Java包名。因此,上述Package com.example等价与com.example,如下:
js> com.example
[JavaPackage com.example]
刚才演示了如何通过js shell访问Java包,访问Java类的方式类似。假如我们需要访问标准的Java 文件类java.io.File,如下。
js> java.io.File
[JavaClass java.io.File]
或者,为避免输入全名,我们先导入包,然后输入Class类名,如下:
js> importPackage(java.io)
js> File
[JavaClass java.io.File]
这里的importPackage(java.io),在效果上等价于Java声明import java.io.*; 不同的是,Java会隐式import java.lang.*,而Rhino不会。因为Rhino定义的对象Boolean, Math, Number, Object, String等与Java语法完全不同,两者无法等价。
这里需要注意的是,Rhino对该语法的错误处理机制,当被访问的类存在时,Rhino加载该class,而当其不存在时,则把它当成package名称,而并不会报错。例如,当访问一个不存在的类com.example.AAA时,输入如下。
js> com.example.AAA
[JavaPackage com.example.AAA]
仅当访问类AAA时,Rhino才会报错。
2. Rhino如何与Java对象交互
与Java类似,Rhino使用new操作符创建对象。
js> new java.util.Date()
Thu Nov 03 16:19:04 CST 2011
可以使用JavaScript变量存储Java对象,并调用其方法,如下:
js> f = new java.io.File("sample.txt")
sample.txt
js> f.isDirectory()
false
对于static方法与变量,调用如下:
js> java.lang.Math.PI
3.141592653589793
js> java.lang.Math.cos(0)
1
【IT168 专稿】在JavaScript中,方法本身就是对象,这一点与Java不同。我们可以通过下列方式查看方法的重载:
js> f.listFiles
function listFiles() {/*
java.io.File[] listFiles()
java.io.File[] listFiles(java.io.FilenameFilter)
java.io.File[] listFiles(java.io.FileFilter)
*/}
输出中列出三个重载方法。第一个为无参函数,第二与第三个对应的参数分别为FilenameFilter与FileFilter。
另一个比较有意思的特点是通过构造for..in,查看对象对应的所有方法与变量。如下:
js> for (i in f) { print(i) }
exists
parentFile
mkdir
toString
wait
[44 others]
这里列出的方法一部分来自于父类,比如wait来自父类java.lang.Object。
对于JavaBean,Rhino也提供按名字访问的简单方式。比如,通过下面这种方式,我们就可以调用File对象的getName与isDirectory方法:
js> f.name
test.txt
js> f.directory
false
3. Rhino如何实现Java接口
JavaScript当中,方法本身就是对象。下面我们通过JavaScript语法{propertyName: value}声明一个JavaScript方法,并调用该方法如下:
js> obj = { run: function () { print("\nrunning"); } }
[object Object]
js> obj.run()
running
现在我们构造一个JavaScript对象,实现Runnable接口。并将该对象作为参数,构造一个新的线程,并启动该线程。
js> r = new java.lang.Runnable(obj);
adapter1@291aff
js> t = new java.lang.Thread(r)
Thread[Thread-0,5,main]
js> t.start()
js>
running
最后的js>提示符与新线程的打印输出running的先后顺序是随机的,取决于线程的调度策略。
从后端的处理流程来讲,Rhino首先为Runnable接口的实现类生成Java字节码文件。然后调用JavaScript对象定义的Run方法。
4. Rhino如何创建Java 数组
Rhino使用Java的发射机制生成数组。下面是生成2个String对象的代码:
js> array = java.lang.reflect.Array.newInstance(java.lang.String, 2);
[Ljava.lang.String;@a20892
js> array[0] = "Double"
Double
js> array[1] = "Life"
Life
js> array[0] + array[1]
DoubleLife
js>
5. Rhino如何捕获与处理异常
与Java类似,Rhino使用try...catch关键字处理异常。
js> function classForName(name) {
try {
return java.lang.Class.forName(name);
} catch (e if e.javaException instanceof java.lang.ClassNotFoundException) {
print("Class " + name + " not found");
} catch (e if e.javaException instanceof java.lang.NullPointerException) {
print("Class name is null");
}
} > > > > > > > >
js> classForName("NonExistingClass");
Class NonExistingClass not found
js> classForName(null);
Class name is null
【IT168 专稿】6. Rhino如何调用js文件
当然,除了在命令行的方式,我们还可以使用操纵JavaScript文件。下面是一段JavaScript代码,主要目的是判断该数是否为质数。代码如下:
function isPrime (num)
{
if (num <= 1) {
print("Enter an integer no less than 2.")
return false
}
var prime = true
var sqrRoot = Math.round(Math.sqrt(num))
for (var n = 2; prime & n <= sqrRoot; ++n) {
prime = (num % n != 0)
}
return prime
}
我们保存文件为C:\isPrime.js。然后我们需要调用load方法加载该脚本。最后,我们可以调用isPrime方法来判断是否为质数。
js> load("C:/isPrime.js")
js> isPrime(33);
false
js> isPrime(31)
true
需要注意的是,注意:文件分隔符需要调整,是“/”而不是“\”。
上述部分示例可以参见Rhino官方网站https://developer.mozilla.org/en/Scripting_Java。另外examples目录下很多例子都值得参考与学习。
刚才使用JavaScript操纵Java对象。接下来我们看看如何使用Java程序访问JavaScript
Java对象操纵JavaScript
下面是一段Java代码,用来运行数学表达式。代码如下:
package com.example;
import sun.org.mozilla.javascript.internal.Context;
import sun.org.mozilla.javascript.internal.Scriptable;
publicclass Test {
publicstaticvoid main(String[] args) {
Context cx = Context.enter();
try {
Scriptable scope = cx.initStandardObjects();
String str = "3/(1+2)";
Object result = cx.evaluateString(scope, str, null, 1, null);
System.out.println(str + "=" + Context.toNumber(result));
} finally {
Context.exit();
}
}
}
运行Java com.example.Test,输出结果如下:
3/(1+2)=1.0
之所以是1.0而不是1,是因为Context.toNumber(result)返回的类型为double。另一个值得注意的是,这里import的package属于JDK 6.0。因此,在不需要Rhino提供的js.jar,该程序仍能独立运行。
虽然Rhino作为JavaScript运行时,功能非常强大,但在性能上却无法与其他的JavaScript运行时(比如Google Chrome的V8 JavaScript Engine)相提并论。值得注意的是,JRuby专家Charles Oliver Nutter也开始参与Rhino项目中,以提升Rhino JavaScript运行时的速度,进而实现与V8的竞争。而Oracle在对JVM上的JavaScript改进与优化,我们有理由期待,在未来,新一代JavaScript运行时Nashorn的速度将会得到极大的提升。
- 深入浅出Rhino:Java与JS互操作.zip (27.5 KB)
- 下载次数: 26
发表评论
-
读取文件数据入库与读取表数据生成文件
2016-12-02 17:41 795资源中内容包括两种功能: 1.把数据库的数据,通过sql查 ... -
word与excel转pdf的实现
2016-12-02 17:32 1076用aspose实现word与excel转成pdf的功能,附 ... -
根据类查找其所在的jar包
2016-12-02 17:23 1132package text; import java.io ... -
shell查询数据生成文件到指定路径
2016-04-07 18:09 899############################## ... -
执行远程服务器上的shell脚本2
2015-01-05 11:43 0package com.linkage.maitain.fa ... -
执行远程服务器上的shell脚本
2015-01-05 11:40 5672package com.linkage.interface ... -
单点登录cookie传值
2014-11-20 17:29 1478用cookies保存登录信息,下次能直接登录 先看登录页 ... -
Webservice接口开发简单例子
2014-04-30 15:45 20401Webservice是系统对外的接口,比如你要从别的网站或服 ... -
常见乱码处理
2014-03-26 23:33 842注意:保持整个项目中所有的编码都统一。 1、eclipse ... -
struts2通配符的用法
2014-03-03 16:19 934先看我们的action配置 <package na ... -
weblogic11g部署项目
2013-09-06 17:29 1329进入weblogic控制台部署项目:http://127. ... -
查找某个类所在jar包
2013-09-05 10:00 5443package com.test; import ja ... -
Spring+Struts2+Hibernate整合
2013-08-01 23:14 5941附件:整合过程word文档。s2sh无注解整合.zip ... -
配置ssh常见异常
2013-01-15 11:42 21501、在做struts时,出现 ... -
JDK的动态代理
2012-09-12 23:57 1274花了三天时间终于把马士兵的动态代理看完了,这是我做的一些 ... -
maven+struts2+jetty项目实例讲解
2012-07-05 14:59 1237Maven在eclipse中的运用 一、安装Mave ... -
Velocity的基本用法
2012-06-29 11:30 21298Velocity的基本用法< ... -
JBoss的安装与配置
2012-03-27 13:39 1267JBoss的安装与配置下载与安装 JBoss 在本文中,我们下 ... -
把java文件做成exe
2012-03-13 15:06 1025在word文档中详细介绍怎么把java文件做成exe -
Urlrewrite的配置与使用方法
2012-03-02 14:06 1876Urlrewrite的配置与使用方法: 1. 导入urlr ...
相关推荐
制定CA6140车床拨叉的加工工艺,设计钻φ5孔的钻床夹具设计.rar
这是 《128 基于STM32的儿童误锁车内远程报警系统【QT上位机源码】》 项目的Qt上位机上位机源码包。 这是一个Qt工程,采用QT5.12.6版本开发的源码。支持生成Windows系统运行程序。也支持生成Android手机APP。 对应项目的博客链接:https://blog.csdn.net/xiaolong1126626497/article/details/132015856 注意 注意 注意!!!: 如果不需要修改上位机源码,就不用下载本资源 (本项目的STM32源码包里就包含了上位机APP安装包,可以直接使用),在设计文档里也写了上位机的核心代码。 如果想学习本项目的上位机开发,学习上位机的源码,修改源。那么可以下载。 最好自己具备一定的Qt开发基础。
水泥粉磨生产工艺流程图.zip
WINDOWS系统读取苹果分区的利器,支持HFS+及APFS分区。
基于Ryu 控制器和 Mininet 实现软件定义网络(SDN)负载均衡解决方案,用于网络模拟.zip
20250415API翻譯
Git知识学习(尚硅谷)
手机充电器的模具设计.zip
python
基于SpringBoot的体育商品推荐系统,系统包含两种角色:管理员、用户主要功能如下。 【用户功能】 1. **首页:** 浏览体育商品推荐系统的主要信息。 2. **商品信息:** 查看系统推荐的体育商品。 3. **交流论坛:** 参与用户间的体育商品讨论和交流。 4. **公告资讯:** 查看系统发布的重要通知和体育商品资讯。 5. **留言板:** 发表个人意见和留言,参与系统互动。 6. **购物车:** 查看已选购的体育商品,进行结算和下单。 7. **个人中心:** 管理个人信息,查看订单历史和进行相关操作。 【管理员功能】 1. **首页:** 查看体育商品推荐系统。 2. **个人中心:** 修改密码、管理个人信息。 3. **用户管理:** 审核和管理注册用户的信息。 4. **商品分类管理:** 管理体育商品的分类信息。 5. **商品信息管理:** 监管和管理体育商品的信息。 6. **交流论坛:** 管理用户间的讨论和交流,包括删除不当内容。 7. **留言板:** 管理用户的留言,进行适当的处理。 8. **系统管理:** - **轮播图管理:** 管理系统首页的轮播图,包括添加、编辑和删除。 - **关于我们:** 编辑和更新关于体育商品推荐系统的介绍。 - **公告资讯:** 发布、编辑和删除系统的通知和公告。 - **系统简介:** 提供体育商品推荐系统的简要介绍。 9. **订单管理:** - **已退款订单:** 查看和管理已退款的订单信息。 - **未支付订单:** 查看和管理未支付的订单信息。 - **已发货订单:** 查看和管理已发货但未完成的订单信息。 - **已支付订单:** 查看和管理已支付但未完成的订单信息。 - **已完成订单:** 查看和管理已完成的订单信
内容概要:本文详细介绍了LiteOS这一轻量级物联网操作系统,涵盖其特点、应用场景、开发环境搭建、内核机制、实战演练及进阶学习。LiteOS由华为开发,专为资源受限设备设计,具备轻量级、高效性、安全性和开放性等特点,适用于智能家居、工业自动化、智能穿戴和智能城市建设等领域。文章逐步讲解了Windows和Linux系统下搭建LiteOS开发环境的具体步骤,包括安装交叉编译器、HiSpark Studio、配置Python环境、下载并配置LiteOS SDK等。深入探讨了LiteOS内核的任务管理和内存管理机制,并通过Hello World程序展示了创建任务、编写代码、编译和烧录的完整流程。最后,介绍了SAL及socket编程,提供了丰富的学习资源,包括官方文档、技术论坛和开源代码库。 适合人群:具备一定编程基础,尤其是对物联网开发感兴趣的开发者,以及希望深入了解嵌入式操作系统原理的技术人员。 使用场景及目标:①学习如何在资源受限的设备上开发高效稳定的应用程序;②掌握LiteOS的任务管理、内存管理等核心机制;③通过实战演练和进阶学习,提高物联网设备的网络通信能力,如使用SAL及socket编程实现设备与服务器之间的TCP通信。 其他说明:本文不仅提供了理论知识,还结合具体代码示例和实际操作步骤,帮助读者更好地理解和应用LiteOS。物联网技术正处于快速发展阶段,掌握LiteOS开发技能将为开发者在智能家居、工业自动化、智能穿戴等领域提供强大的竞争力。
Android开发14版本请求存储权限,它有部分允许权限,有一点难度。
在vs集成开发环境中,使用C/C++开发的游戏:球球大作战(注意要使用EasyX库)
内容概要:本文档为《露天矿山边坡安全监测技术规范》,旨在规定金属非金属露天矿山采场边坡安全监测的原则、内容、方法和技术要求,涵盖变形监测、采动应力监测、爆破振动监测、降雨和地下水监测、视频监控、在线监测系统等方面。文档详细介绍了监测系统的安装、维护和监测资料的整理分析等管理要求。通过定义边坡分类、安全监测分级、监测要求和具体监测方法,确保露天矿山边坡的安全性和稳定性。 适用人群:适用于从事露天矿山边坡安全监测的设计、施工、管理和研究人员,以及矿山企业的安全管理人员。 使用场景及目标:①用于指导露天矿山边坡的安全监测工作,确保监测系统的设计、安装、调试和运行符合标准;②通过对边坡变形、应力、爆破振动、水文气象等进行监测,预防和控制边坡失稳事故的发生;③利用在线监测系统和数据分析,实现对边坡安全状况的实时监控和预警。 其他说明:本文档不适用于与煤共生、伴生的金属非金属露天矿山采场边坡。文档提供了详细的监测方法和要求,强调了监测系统的兼容性、可扩展性和数据的安全存储。此外,还特别强调了定期巡查和信息反馈机制的重要性,以确保监测系统的有效运行和及时响应异常情况。
acacia_door_bottom
Android开发不用存储权限进行拍照,得到拍照后的图片效果。有一点难度,关键是存储路径的定义。
27910240_g.zip
Android开发红包动画效果,红包在那左晃右晃,吸引你点击。
资源demo