首页 > 其他分享 >Jvm上如何运行其他语言?JSR223规范最详细讲解

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

时间:2022-12-07 10:58:51浏览次数:66  
标签:脚本 java 脚本语言 JSR223 编译 Jvm 讲解 语言

在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,不仅能用脚本来编写逻辑,还能进行规则编排。

项目官网:

https://liteflow.yomahub.com

gitee托管仓库:

https://gitee.com/dromara/liteFlow

希望大家都能从JSR223规范中找到一些设计你们相关业务系统的灵感。

标签:脚本,java,脚本语言,JSR223,编译,Jvm,讲解,语言
From: https://www.cnblogs.com/bryan31/p/16962431.html

相关文章

  • 2022 年超详细步骤讲解 CentOS 7 安装Redis 。解决Redis Desktop Manager 图形化工具
    1、将redis安装包上传到虚拟机对应位置创建redis目录、直接就安装在这里2、解压安装包tar-zxvfredis-6.2.6.tar.gz3、删除安装包rm-fredis-6.2.6.tar.gz4......
  • HashTable讲解
            ......
  • 数据库(js部分讲解)
    BOM操作BOM(BrowserObjectModel)是指浏览器对象模型,它使JavaScript有能力与浏览器进行“对话”window.open() window.open('https://www.sogo.com/','','width=800......
  • jvm相关参数设置
    -Djava.library.path=/usr/local/lib-server-Xms4g-Xmx4g-XX:ParallelGCThreads=4-XX:+UseConcMarkSweepGC-XX:MaxDirectMemorySize=2.5g-XX:+HeapDumpOnOutOfMemor......
  • 解读JVM级别本地缓存Caffeine青出于蓝的要诀 —— 缘何会更强、如何去上手
    大家好,又见面了。本文是笔者作为掘金技术社区签约作者的身份输出的缓存专栏系列内容,将会通过系列专题,讲清楚缓存的方方面面。如果感兴趣,欢迎关注以获取后续更新。在......
  • 创建Vue实例对象,系统地讲解MVVM分层开发
    一、创建Vue实例对象,详解MVVM本节正式进入Vue.js的讲解,首先需要安装Vue.js,安装方式有两种,本节讲解第一种安装方式,即通过CDN安装,这种方式非常简单,只需要在文件中引入CDN网址......
  • 单一JVM同步锁实现
    同步锁实现一、背景在并发场景下,需要单一线程或限定并发数操作某些逻辑,这时候就需要用到一个锁来保证线程安全。二、思路使用ConcurrentHashMap实现,但只支持同一个jvm......
  • 【深入理解java虚拟机】 - JVM字节码指令介绍
    文章目录​​什么是字节码指令​​​​javap的用法​​​​字节码与数据类型​​​​字节码指令集​​​​加载和存储指令​​​​运算指令​​​​类型转换指令​​​​对......
  • 【深入理解java虚拟机】 - JVM垃圾回收器
    文章目录​​概述​​​​并发与并行​​​​垃圾回收器的分类​​​​7种经典的垃圾回收器​​​​垃圾回收器​​​​Serial与SerialOld回收器​​​​ParNew回收器​......
  • 【深入理解java虚拟机】 - JVM垃圾回收算法
    文章目录​​对象是否存活?​​​​引用计数法​​​​可达性分析法​​​​强、软、弱、虚​​​​finalize()​​​​垃圾收集算法​​​​分代收集理论​​​​标记—清除......