热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

在JAVA中调用JavaScript代码

在JAVA中调用JavaScript代码有些时候,我们在执行JAVA代码的时候,希望能够通过执行其他脚本语言(如js,修改脚本新逻辑立即生效ÿ
在JAVA中调用Javascript代码

有些时候,我们在执行JAVA代码的时候,希望能够通过执行其他脚本语言(如js, 修改脚本新逻辑立即生效,不需要重新加载)根据其结果来进行逻辑判断,自java SE 8开始已经集成了Nashorn Javascript引擎作为JDK的一部分。

1.使用nashorn引擎


1.1直接执行脚本


1.1.1查询引擎使用nashorn

public static void main(String[] args) throws Exception {ScriptEngineManager scriptEngineManager = new ScriptEngineManager();ScriptEngine scriptEngine =scriptEngineManager.getEngineByName("nashorn");//执行脚本scriptEngine.eval("print('Hello,World')");
}

1.1.2查询引擎使用Javascript

public static void main(String[] args) throws Exception {
ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
ScriptEngine scriptEngine = scriptEngineManager.getEngineByName("Javascript");
//执行脚本
scriptEngine.eval("print('Hello,World')");
}

1.2 执行脚本指定函数


1.2.1查询引擎使用nashorn

public static void main(String[] args) throws Exception {ScriptEngineManager scriptEngineManager = new ScriptEngineManager();ScriptEngine scriptEngine =scriptEngineManager.getEngineByName("nashorn");//传入脚本scriptEngine.eval("function hello(name){print('Hello,'+ name )}");//ScriptEngine强转为InvocableInvocable inv = (Invocable) scriptEngine;//调用函数,传入参数inv.invokeFunction("hello", "Javascript");}

1.2.2查询引擎使用Javascript

public static void main(String[] args) throws Exception {ScriptEngineManager scriptEngineManager = new ScriptEngineManager();ScriptEngine scriptEngine = scriptEngineManager.getEngineByName("nashorn");//传入脚本scriptEngine.eval("function hello(param) {\n" +" if(param == '123') {\n" +" return true;\n" +" }\n" +" return false;\n" +"}");//ScriptEngine强转为InvocableInvocable inv = (Invocable) scriptEngine;//调用函数,传入参数boolean result = (Boolean) inv.invokeFunction("hello", "12");System.out.println(result);

1.3 获取的都是nashorn引擎

//获取的都是nashorn引擎scriptEngineManager.getEngineByName("nashorn");scriptEngineManager.getEngineByName("Javascript");

NashornScriptEngineFactory截图

NashornScriptEngineFactory截图

2. 使用脚本语言的优点


  1. 脚本语言可以直接运行,不需要编译为字节码,如果修改了逻辑不需要重新启动应用,立刻生效
  2. 动态类型,创建变量不需要创建及声明类型,可以重复使用变量

参考
https://docs.oracle.com/javase/8/docs/technotes/guides/scripting/prog_guide/about.html#sthref8
https://docs.oracle.com/javase/8/docs/technotes/guides/scripting/prog_guide/api.html#CDEGJDJF


推荐阅读
  • 深入理解Java SE 8新特性:Lambda表达式与函数式编程
    本文作为‘Java SE 8新特性概览’系列的一部分,将详细探讨Lambda表达式。通过多种示例,我们将展示Lambda表达式的不同应用场景,并解释编译器如何处理这些表达式。 ... [详细]
  • 长期从事ABAP开发工作的专业人士,在面对行业新趋势时,往往需要重新审视自己的发展方向。本文探讨了几位资深专家对ABAP未来走向的看法,以及开发者应如何调整技能以适应新的技术环境。 ... [详细]
  • 1.绑定htmlcss1.1对象语法:  传给v-bind:class一个对象,以动态地切换class   ... [详细]
  • 本文详细探讨了在Java中如何将图像对象转换为文件和字节数组(Byte[])的技术。虽然网络上存在大量相关资料,但实际操作时仍需注意细节。本文通过使用JMSL 4.0库中的图表对象作为示例,提供了一种实用的方法。 ... [详细]
  • H5技术实现经典游戏《贪吃蛇》
    本文将分享一个使用HTML5技术实现的经典小游戏——《贪吃蛇》。通过H5技术,我们将探讨如何构建这款游戏的两种主要玩法:积分闯关和无尽模式。 ... [详细]
  • Java 中的十进制样式 getZeroDigit()方法,示例 ... [详细]
  • 问题描述现在,不管开发一个多大的系统(至少我现在的部门是这样的),都会带一个日志功能;在实际开发过程中 ... [详细]
  • 数据类型--char一、char1.1char占用2个字节char取值范围:【0~65535】char采用unicode编码方式char类型的字面量用单引号括起来char可以存储一 ... [详细]
  • 本文详细介绍了如何利用 Bootstrap Table 实现数据展示与操作,包括数据加载、表格配置及前后端交互等关键步骤。 ... [详细]
  • 流处理中的计数挑战与解决方案
    本文探讨了在流处理中进行计数的各种技术和挑战,并基于作者在2016年圣何塞举行的Hadoop World大会上的演讲进行了深入分析。文章不仅介绍了传统批处理和Lambda架构的局限性,还详细探讨了流处理架构的优势及其在现代大数据应用中的重要作用。 ... [详细]
  • 本文详细介绍了JQuery Mobile框架中特有的事件和方法,帮助开发者更好地理解和应用这些特性,提升移动Web开发的效率。 ... [详细]
  • 最新版 EasyCriteria 3.0 已正式上线,该版本经过全面重构,带来了多项性能优化与功能增强。更多详情请参阅官方文档:http://uaihebert.com/?p=1898 ... [详细]
  • importjava.io.*;importjava.util.*;publicclass五子棋游戏{staticintm1;staticintn1;staticfinalintS ... [详细]
  • 本文介绍了一种方法,通过使用Python的ctypes库来调用C++代码。具体实例为实现一个简单的加法器,并详细说明了从编写C++代码到编译及最终在Python中调用的全过程。 ... [详细]
  • 本文介绍如何使用JavaScript中的for循环来创建一个九九乘法表,适合初学者学习循环结构的应用。 ... [详细]
author-avatar
浩斯科技
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有