——在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脚本语言,需要依赖第三方依赖
