Jvm上如何运行其他语言?JSR223规范最详细讲解

news2024/11/16 9:53:32

在Java的平台里,其实是可以执行其他的语言的。包括且不仅限于jvm发展出来的语言。

有的同学可能会说,在java项目里执行其他语言,这不吃饱了撑着么,java体系那么庞大,各种工具一应俱全,放着好好的java不写,还要去执行其他语言干嘛。

写java的都知道,java是需要事先编译的,这意味着你很难去在运行中改变编译好的class信息,除非你用字节码等技术栈,但是这也是需要很大的成本的。要想在运行中很方便的改变业务逻辑,其实用java去执行其他的脚本语言是一个好办法。况且有的脚本语言有着比java更简洁的语法特性。

有兴趣的小伙伴也可以看看之前的这篇文章: Java项目有可能做到所有的代码逻辑均可热部署吗?

在java中执行其他语言,可能你会觉得这应该很复杂,需要去学习每种语言包相关的api。

笔者是开源框架LiteFlow的作者,在规则引擎LiteFlow中实践并支持了许多的其他语言,如groovy,js,python,lua等。

我可以负责任的说,在Java平台中调用其他脚本语言,其实一点都不复杂,你无需关心每种语言的实际api。

这一切都归功于一个规范:JSR223

相信有大部分人没听过这个Java平台的规范。

JSR223规范最初在Java6平台被提出,提供了一套标准的API为脚本语言的执行提供了内置支持。

也就是说,你只要熟悉这一套API就能执行大部分的脚本语言。

而且这套API的使用也是非常方便的,几个核心方法仔细看个10分钟就能明白如何使用。

来个最简单的例子:

//获得javascript的脚本引擎
ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
ScriptEngine scriptEngine = scriptEngineManager.getEngineByName("javascript");
//进行脚本编译
String script = "function process(){\n" +
  "var a=10\n" +
  "var b=3\n" +
  "return a*b-c\n" +
  "}\n" +
  "process()";
CompiledScript compiledScript = ((Compilable) scriptEngine).compile(script);
//绑定java的参数
Bindings bindings = new SimpleBindings();
bindings.put("c", 5);
//执行并打印结果
Object result = compiledScript.eval(bindings);
System.out.println(result);
复制代码

上述代码演示的是用JSR223 API去执行javascript语言。值得一提的是,java内置了javascript引擎,你无需引入任何第三方包依赖就可以获得这个引擎。

整个过程分4块,分别是获得引擎,脚本编译,绑定java参数,执行。

在实际业务中,建议在系统启动的时候去编译脚本,然后把编译好的脚本对象compiledScript 对象给缓存起来,因为编译过程相对比较耗时,运行时每次去编译是个糟糕的设计。

如果在运行中改变了脚本,只需要重新去编译这个脚本并缓存其编译后的对象即可。

你只需要掌握以上代码,那几乎就已经掌握了JSR223规范的使用了。是不是很简单?

如果你想换成groovy脚本语言,那你需要依赖第三方依赖

<dependency>
    <groupId>org.codehaus.groovy</groupId>
    <artifactId>groovy-jsr223</artifactId>
  	<version>3.0.8</version>
</dependency>
复制代码

然后在上述的代码里获得引擎这块换成groovy即可:

...
ScriptEngine scriptEngine = scriptEngineManager.getEngineByName("groovy");
...
复制代码

如果你想换成python,需要依赖第三方依赖

<dependency>
    <groupId>org.python</groupId>
    <artifactId>jython-standalone</artifactId>
  	<version>2.7.3</version>
</dependency>
复制代码

然后在上述的代码里获得引擎这块换成python即可:

...
ScriptEngine scriptEngine = scriptEngineManager.getEngineByName("python");
...
复制代码

看到这,是不是对利用JSR223规范如何执行脚本恍然大悟了呢。

其实现在很多的语言在java平台都推出了自己的java三方执行依赖包,而且很多的包都支持了JSR223规范。只要支持了JSR223规范的语言,都可以利用上述的代码来执行。

JSR223规范的API可以支持java和其他语言的绑定和互通,一个java对象通过bindings对象也是可以传到脚本语言中的,在脚本语言中,你可以获得java的对象,来进行调用其方法和进行逻辑计算。

不过不同的语言调用操作符也许有所不同,比如groovy,javascript都是通过点操作符,和java很像,笔者在LiteFlow里新支持了Lua脚本,Lua脚本的对java对象的操作符是冒号。所以当你的项目支持相关的脚本语言之前,你先要熟悉下相关语言的语法。

用脚本语言来担当java平台中经常需要变动的部分是一个不错的选择。关键原因是脚本语言的编译,执行完全是动态的,这意味着你可以在java运行中改变脚本,重新编译,并执行。利用此特性来进行变相的热部署。

LiteFlow就是这样一款能够让你用多种脚本语言来定义你逻辑的规则引擎框架,这其中也利用了JSR223的规范API,不仅能用脚本来编写逻辑,还能进行规则编排。

 

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

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

相关文章

责任链模式在复杂数据处理场景中的实战

相信大家在日常的开发中都遇到过复杂数据处理和复杂数据校验的场景&#xff0c;本文从一线开发者的角度&#xff0c;分享了责任链模式在这种复杂数据处理场景下的实战案例&#xff0c;此外&#xff0c;作者在普通责任链模式的基础上进行了升级改造&#xff0c;可以适配更加复杂…

34_DAC原理及数模转换实验

目录 数模转换原理 DAC模块框图 事件选择控制数字模拟转换 DAC转换 DAC数据格式 选择DAC触发 DAC输出电压计算 硬件连接 DAC配置步骤 实验源码 数模转换原理 STM32的DAC模块(数字/模拟转换模块)是12位数字输入,电压输出型的DAC。DAC可以配置为8位或12位模式,也可以与…

linux安装nginx

1.nginx官网 http://nginx.org/en/download.html 下载安装包&#xff0c;如图所示下载nginx-1.23.2&#xff0c;并上传到指定目录&#xff1a;/usr/local/src/nginx 2.解压 tar -zxvf nginx-1.23.2.tar.gz3.安装nginx&#xff0c; cd /usr/local/src/nginx/nginx-1.23.2 该目录…

Titanic 泰坦尼克数据集 特诊工程 机器学习建模

以下内容为讲课时使用到的泰坦尼克数据集分析、建模过程&#xff0c;整体比较完整&#xff0c;分享出来&#xff0c;希望能帮助大家。部分内容由于版本问题&#xff0c;可能无法顺利运行。 Table of Contents 1 经典又有趣的Titanic问题1.1 目标1.2 解决方法1.3 项目目的2…

Vector-常用CAN工具 - CANoe入门到精通_03

NetWork Node 前面已经介绍了CANoe的基本情况、硬件环境搭建、CANoe软件环境配置&#xff0c;今天我们就来聊一下NetWork Node&#xff0c;在我们的测试工作中&#xff0c;大部分情况我们默认CANoe作为一个Client端&#xff0c;但是有些情况&#xff0c;我们需要实时监测被测件…

Akka 学习(四)Remote Actor

目录一 介绍1.1 Remote Actor1.2 适用场景1.3 踩坑点二 实战2.1 需求2.2 Java 版本2.2.1 效果图2.2.2 实体类2.2.3 服务端Actor 处理2.2.4 服务端配置文件2.2.5 客服端Actor处理2.2.6 客服端配置文件2.2.7 测试2.3 Scala 版本2.3.1 效果2.2.3 服务端Actor处理2.3.4 客户端Actor…

使用 Excel 数据透视表深入研究数据分析

问题 1(文章数据在底部) 为美国选民案例研究创建一个数据透视表,并用它来回答以下问题: A) 有多少个州的选民人口百分比低于 55%?哪些州? 答:有5个州的选民人数低于55%,分别是得克萨斯州、阿肯色州、俄克拉荷马州、夏威夷州和西弗吉尼亚州。 步骤:根据以下结果,创建…

基于jsp+java+ssm的社会保险信息管理系统-计算机毕业设计

项目介绍 课题研究的基本内容及预期目标或成果 用户注册与登录功能&#xff0c;在单位注册功能中有申请管理功能&#xff0c;填写具体信息。 系统管理员&#xff1a; 1&#xff09;个人密码修改&#xff1a;实现了管理员用户密码信息的修改。 2&#xff09;参保人员管理&a…

ORACE dbca创建报错Oracle system identifier(SID) “orcl“

最近项目需要通过备份恢复oracle实例&#xff0c;必须使用orcl&#xff0c;通过dbca创建实例是提示如下报错&#xff1a; 查看日志&#xff0c;$ORACLE_HOME/cfgtoollogs/dbca/dbcaui.log EVERE: [FATAL] A database instance with Oracle system identifier(SID) "orcl&…

零基础入门推荐系统 - 新闻推荐 - 实操2

内容导航: 零基础入门推荐系统 - 新闻推荐 - 实操2比赛数据分析:用户属性分析:训练集和测试集中分别有多少用户&#xff1f;用户城市分布有什么规律&#xff1f;平均每个用户会点击多少个文章&#xff1f;点击来源与文章点击次数是否存在关联&#xff1f;用户行为分析:零基础入…

【车载开发系列】UDS诊断---读取周期标识符($0x2A)

【车载开发系列】UDS诊断—读取周期标识符&#xff08;$0x2A&#xff09; UDS诊断---读取周期标识符&#xff08;$0x2A&#xff09;【车载开发系列】UDS诊断---读取周期标识符&#xff08;$0x2A&#xff09;一.概念定义二.报文格式1&#xff09;请求报文2&#xff09;初始响应3…

[附源码]计算机毕业设计课程在线测评系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

打破信息壁垒,提升业务水平,纷享销客CRM带给木链科技不一样的体验

步入数字化时代&#xff0c;企业业务模式和员工工作方式日新月异&#xff0c;传统协作方式很显然已经难以适应当前的需求&#xff0c;企业亟需一种新的面向信息化的协作方式&#xff0c;以提高工作效率&#xff0c;提升业务水平。 这样的挑战也发生在工业互联网安全企业&#…

Oracle一次获取多个序列值

Oracle一次获取多个序列值SQL 语句一次获取多个序列值获取序列中的多个值connect by level 生成多行数据JDBC 一次获取多个序列值MyBatis 一次获取多个序列值SQL 语句一次获取多个序列值 获取序列中的多个值 创建序列 CREATE SEQUENCE test_user_seq;获取一个序列值 SELECT…

Linux系统(Centos 7)配置DNS客户端

配置DNS客户端 DNS 客户端的配置非常简单&#xff0c;假设本地首选DNS服务器的IP地址为192.168.10.1&#xff0c;备用DNS 服务器的IP地址为192.168.10.2&#xff0c;则 DNS客户端的设置如下。 配置Windows 客户端 打开“Intermet 协议&#xff08;TCP/IP)”属性对话框&a…

8_3、Java基本语法之线程的生命周期与同步

一、线程的生命周期 JDK中用Thread.State类定义了线程的几种状态 要想实现多线程&#xff0c;必须在主线程中创建新的线程对象。Java语言使用Thread类 及其子类的对象来表示线程&#xff0c;在它的一个完整的生命周期中通常要经历如下的五种状态&#xff1a; 新建&#xff1a; …

基于ARIMA、SVM、随机森林销售的时间序列预测

如今DT&#xff08;数据技术&#xff09;时代&#xff0c;数据变得越来越重要&#xff0c;其核心应用“预测”也成为互联网行业以及产业变革的重要力量。最近我们被客户要求撰写关于销售时间序列预测的研究报告&#xff0c;包括一些图形和统计输出。对于零售行业来说&#xff0…

Elsevier(爱思唯尔)LaTex 模板详细说明

Elsevier 模板的使用 官方网站提供的 Latex Instructions&#xff0c;Elsevier 模板下载地址&#xff1a;elsarticle-template.zip [ 如果不了解文档类的作用&#xff0c;可以参考&#xff1a;documentclass ] Elsevier 提供了 3 种自定义的文档类&#xff1a; elsarticle…

大厂软件测试流程完整版

目 1.概述 1.1目的 有效的保证软件质量&#xff1b; 有效的制定不同测试类型&#xff08;软件系统测试、音频主观性测试、Field Trial、专项测试、自动化测试、性能测试、用户体验测试&#xff09;的软件测试计划&#xff1b; 按照计划进行测试&#xff0c;发现软件中存在…