什么?java中居然可以执行js代码了?真是不知者不怪

今天在书上看的,java中可以直接调用js的函数了,言外之意就是java已经支持外部的脚本语言了(在运行期解释执行的),查了查,jdk从1.6之后开始支持的,1.6之前不可以。

为什么Java这种编译语言还需要这些脚本语言呢?大概是因为脚本语言有的一些特性java没有吧,比如:

灵活,一般像js这种脚本语言,你可以不用声明变量类型而直接使用,也可以在运行期改变类型。
方便,我们都知道java语言运行之前需要编译成字节码文件,然后才能运行。但是脚本语言是一种解释型语言,它的执行是靠解释器解释的,因此在运行期变更代码也非常方便,不用停止应用。

简单,只要有其他编程语言开发的经验,在入门脚本语言很容易上手。

你看,这么些特点java是没有的,那如果引到java里面,是不是能使得java更加强大,答案是肯定的。

下面我们来写一个简单的案例:
先创建一个js文件,名为index.js,放在D:\下面,这个js里面我们就只写一个js函数,代码如下:

function reckon(num1,num2){return num1+num2*n;
}

你可能会纳闷,这个n怎么来的?在这里不报错吗?是的,不报错,这个n是从上下文来的,相当于一个运行时变量,接下来我们看看java中怎么调用该js文件中的函数,下面是代码:

//java调用脚本语言public static void testJavaScript(){//获得一个JavaScript引擎ScriptEngine engine = new ScriptEngineManager().getEngineByName("js");//建立上下文变量Bindings bind = engine.createBindings();bind.put("n", 2);//绑定上下文,作用域是当前引擎范围engine.setBindings(bind, ScriptContext.ENGINE_SCOPE);Scanner sc = new Scanner(System.in);while(sc.hasNextInt()){int num1 = sc.nextInt();int num2 = sc.nextInt();//执行js代码try {engine.eval(new FileReader("D://index.js"));//是否可调用方法if(engine instanceof Invocable){Invocable in = (Invocable)engine;//执行js函数Double result = (Double)in.invokeFunction("reckon", num1,num2);System.out.println("运算结果为:"+result);}} catch (FileNotFoundException e) {e.printStackTrace();} catch (ScriptException e) {e.printStackTrace();} catch (NoSuchMethodException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}

其运行结果为:
在这里插入图片描述
现在我们来简单的改一改js函数(注意别让jvm停),将后面的乘号改成减号,修改之后的代码为:

function reckon(num1,num2){return num1+num2-n;
}

然后我们在控制台中继续输入数字,其运行结果为:
在这里插入图片描述
通过分析,我们可以看到,jvm并没有停止,代码while循环可以证明,只要不输入非int类型的数字,那么程序就一直执行。参数我们两次也都输入的一样,num1 = 10和num2 = 20,n=2,只是我们将js的函数稍微改变了一下,结果就不同了,这就是脚本语言对编译最有利的地方,可以随时发布而不用重新部署。

你,学会了吗?有疑问可以留言评论哦~
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/324981.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用 Docker Machine 创建 Azure 虚拟主机

搭建环境向来是一个重复造轮子的过程,Docker Machine 则把用户搭建 Docker 环境的各种方案汇集在了一起。笔者在《Docker Machine 简介》一文中演示了使用 Docker Machine 在本地的 vSphere 主机中安装 Docker 环境。但是在云计算大爆炸的今天,真正让我们…

振华重工携手微软,开启港口运营数字化转型新纪元

上海振华重工(集团)股份有限公司(ZPMC)是重型装备制造行业的知名企业,是港口机械的领军者。企业的港口机械目前已销往93个国家和地区,全球占有率高达82%,多年保持行业领先的地位。 转型大计提上…

在JavaFX程序中嵌入Swing内容

转载自 在JavaFX程序中嵌入Swing内容 本教程描述如何在JavaFX应用程序中嵌入Swing组件。本文将讨论线程限制并提供一个可运行的应用程序来说明在JavaFX应用程序中嵌入带HTML内容的Swing按钮,以及Swing与JavaFX按钮间的协作性。 从JavaFX 2.0版本开始,…

你胆敢不加break试试?

我们经常在实际开发中会用到一些转换类,比如在金融界中,我们需要将1转换为“壹”,2转换成“贰”。还有类似这样的需求,食堂在一周内每天的菜单都是不一样的,周一为鱼香肉丝鸡腿,周二为爆炒土豆丝鲅鱼&#…

微软作为金牌会员加入Cloud Foundry基金会

在最近召开的Cloud Foundry峰会上,微软宣布他们已经加入了Cloud Foundry基金,成为金牌会员。除此之外,微软正在加大对开源云平台的支持力度,他们提供的服务包括Azure数据库(PostgreSQL和MySQL)的后端集成以…

你胆敢在case后面不加break试试?

我们经常在实际开发中会用到一些转换类,比如在金融界中,我们需要将1转换为“壹”,2转换成“贰”。还有类似这样的需求,食堂在一周内每天的菜单都是不一样的,周一为鱼香肉丝鸡腿,周二为爆炒土豆丝鲅鱼&#…

在Swing和Swt中使用JavaFX

转载自 在Swing和Swt中使用JavaFX 本人从08年12月份,JavaFX发布第一个版本开始关注它的发展。 算算到现在,也差不多是第五个年头了。期间经历了一些动荡,但JavaFX还是坚持着发展了下来,也经历了很多改变(这也是Java技术的特点&a…

活动: 北京Xamarin分享会第4期(2017年7月8日)

BXUG(Beijing Xamarin User Group)将举行第4期线下活动,本期内容预告: 案例演讲: "Xamarin原生跨平台开发的风险与收益"分享者: 神秘分享嘉宾Mike,来自国内一线互联网教育公司的研发经理,.NET新时代CTO联盟发起者。方案…

内存模型是怎么解决缓存一致性的

转载自 内存模型是怎么解决缓存一致性的 在再有人问你Java内存模型是什么,就把这篇文章发给他这篇文章中,我们介绍过关于Java内存模型的来龙去脉。 我们在文章中提到过,由于CPU和主存的处理速度上存在一定差别,为了匹配这种差距…

这是什么操作?java中的变量竟然可以先使用后声明?

相信大家在看到标题之后,是疑惑的点进来看内容的。 在看到标题之后,大家肯定会怀疑,我赵某人用java写了好几年的代码了,还真就没见过java中的变量能先用在声明,今天就是进来看看你在没有声明变量的前提下是怎么用的&a…

重写(override / overwrite)

方法的重写(override / overwrite) 1.重写:子类继承父类以后,可以对父类中同名同参数的方法,进行覆盖操作 2.应用:重写以后,当创建子类对象以后,通过子类对象调用子父类中的同名同参数的方法时,…

来吧学学.Net Core之项目文件简介及配置文件与IOC的使用

序言 在当前编程语言蓬勃发展与竞争的时期,对于我们.net从业者来说,.Net Core是风头正紧,势不可挡的.芸芸口水之中,不学习使用Core,你的圈内处境或许会渐渐的被边缘化.所以我们还是抽出一点点时间学学.net core吧. 那VS Code 可以编写,也可以调试Core本人也尝试啦下,但是感觉…

真正的问题应该在我身上……

渐渐地,学生已进入学习状态。在未测试之前,一直以为大家都学的很好,从课堂上的互动氛围就可以看得出来,一问问题,你一言他一语的……在测试之后,真是让我大跌眼镜,平时感觉表现很好的学生们&…

搞定计算机网络面试,看这篇就够了

转载自 搞定计算机网络面试,看这篇就够了 文章目录结构: 一 OSI与TCP/IP各层的结构与功能,都有哪些协议 运输层主要使用以下两种协议: UDP的主要特点: TCP的主要特点: 域名系统(Domain Nam…

来吧学学.Net Core之登录认证与跨域资源使用

序言 学习core登录认证与跨域资源共享是越不过的砍,所以我在学习中同样也遇到啦这两个问题,今天我们就用示例来演示下使用下这2个技术点吧. 本篇主要内容如下: 1、展示一个登录认证的简单示例 2、跨域资源访问 3、跨域获取登录认证的用户信息 .Net Core使用身份认证(Auth…

JSP 获得服务器时间和浏览器时间

发布项目到服务器并访问 创建Web项目,开发静态页面 部署到服务器Tomcat 启动服务器Tomcat 不同用户通过浏览器来访问Web项目 Web项目和Java项目的区别 Web项目需要JavaEE的类库 Web项目中还可以存放静态网页和动态网页 开发目录和部署目录的区别 开发目录&…

如果要你选择某读书APP的图标,你会选择哪一个?

声明:介于尊重每位同学的劳动成果,故本文所有广告收入、赞赏均会均分给同学们!最近学到了平面设计基础,于是让同学们用所学知识以“读书”为主题,原创了各式各样的图标,也许屏幕前的你只是轻轻的一划而过&a…

从理论知识到落地能力,你欠缺了什么?

转载自 从理论知识到落地能力,你欠缺了什么? 本文是一个理论过度到实践的典型案例,借助程序员经常遇到的一个问题——网络为什么不通,来具体说明怎么将书本上的死知识真正变成我们解决问题的能力。 大学学到的基本概念 我相信…

三大特性之多态性

1.理解多态性:可以理解为一个事物的多种形态。 2.何为多态性: 对象的多态性:父类的引用指向子类的对象(或子类的对象赋给父类的引用) 3.多态的使用:虚拟方法调用 有了对象的多态性以后,我们在编…

在这里,我们为您绘制了专属海报,请您查收!

树叶在空中飘荡,谱写着一曲感恩的乐章,那是大树对滋养它的大地的感恩;白云在蔚蓝的天空中飘荡,绘画着那一幅幅感人的画面,那是白云对哺育它的蓝天的感恩。我们沐浴着爱的阳光长大,我们滋润着人间的真情成长&#xff0c…