当前位置: 首页 > 后端技术 > Java

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

时间:2023-04-01 23:48:46 Java

——在Java平台上,其他语言其实是可以执行的。包括但不限于jvm开发的语言。可能有的同学会说,在一个java项目中执行其他语言,这不是满满的吗?java系统那么庞大,各种工具一应俱全。java写不好,还得去执行其他语言什么的。写java的都知道java是需要提前编译的,也就是说你在运行的时候很难去改变编译好的类信息,除非你使用字节码等技术栈,但是这也需要很大的成本。如果想在运行过程中方便的改变业务逻辑,使用java执行其他脚本语言是一个很好的方式。而且,有些脚本语言的语法特点比java更简洁。有兴趣的朋友还可以看看之前的这篇文章:Java项目有没有可能把所有的代码逻辑都热部署?第二,要在java中执行其他语言,你可能会觉得这应该很复杂,需要学习各个语言包相关的API。作者是开源框架LiteFlow的作者。我在规则引擎LiteFlow中实践并支持很多其他语言,比如groovy、js、python、lua等。我可以很负责任的说,在Java平台上调用其他脚本语言其实一点也不复杂,并且您无需关心每种语言的实际API。这一切都归功于一种规范:JSR223。相信大多数人都没有听说过这个Java平台规范。JSR223规范最早是在Java6平台上提出的,提供了一套标准的API,为脚本语言的执行提供内置支持。也就是说,只要熟悉这套API,就可以执行大部分的脚本语言。而且,这套API的使用也非常方便。仔细阅读几个核心方法10分钟就可以明白如何使用了。三个最简单的例子://获取javascript脚本引擎ScriptEngineManagerscriptEngineManager=newScriptEngineManager();ScriptEnginescriptEngine=scriptEngineManager.getEngineByName("javascript");//编译脚本Stringscript="functionprocess(){\n"+"vara=10\n"+"varb=3\n"+"returna*b-c\n"+"}\n"+"process()";CompiledScriptcompiledScript=((Compilable)scriptEngine).compile(script);//绑定java参数Bindingsbindings=newSimpleBindings();bindings.put("c",5);//执行并打印结果Objectresult=compiledScript.eval(bindings);System.out.println(result);上面的代码演示了使用JSR223API来执行javascript语言。值得一提的是,java内置了javascript引擎,无需引入任何第三方包依赖即可获取该引擎。整个过程分为4个部分,分别是获取引擎、编译脚本、绑定java参数、执行。在实际业务中,建议在系统启动时编译脚本,然后将编译后的脚本对象compiledScript对象缓存起来,因为编译过程比较耗时,每次都在运行时编译是一个不好的设计。如果在运行时更改脚本,只需要重新编译脚本并缓存其编译对象即可。你只需要掌握上面的代码,就差不多掌握了JSR223规范的使用。是不是很简单?4.如果要切换到groovy脚本语言,需要依赖第三方依赖org.codehaus.groovygroovy-jsr2233.0.8然后获取上面代码中的engine,换成groovy:...ScriptEnginescriptEngine=scriptEngineManager.getEngineByName("groovy");...如果要转python,需要依赖第3方依赖org.pythonjython-standalone2.7.3然后在上面的代码中获取engine的变化就makepython:...ScriptEnginescriptEngine=scriptEngineManager.getEngineByName("python");...看到这里,是不是一下子明白了如何使用JSR223规范来执行脚本了?第五,现在很多语言都在java平台上推出了自己的java三方执行依赖包,很多包都支持JSR223规范。只要支持JSR223规范的语言,都可以使用上面的代码来执行。JSR223规范的API可以支持java与其他语言的绑定和互通。也可以通过绑定对象将java对象传递给脚本语言。在脚本语言中,可以获取java对象调用其方法,进行逻辑计算。但是,不同的语言可能有不同的调用操作符。例如,groovy和javascript使用点运算符,这与java非常相似。作者在LiteFlow中支持Lua脚本,Lua脚本对java对象的操作符是冒号。所以在你的项目支持相关脚本语言之前,首先要熟悉相关语言的语法。六使用脚本语言来承担java平台经常需要改动的部分是一个不错的选择。关键原因是脚本语言的编译和执行是完全动态的,也就是说你可以在java运行的时候改变脚本,重新编译,执行。利用该特性变相进行热部署。LiteFlow就是这样一个规则引擎框架,它允许你使用多种脚本语言来定义你的逻辑。它还使用了JSR223规范的API,不仅可以用脚本编写逻辑,还可以编排规则。项目官网:https://liteflow.yomahub.comgitee托管仓库:https://gitee.com/dromara/lit...希望大家能从JSR223规范中找到一些设计自己相关业务系统的灵感。