Java8新JavaScript引擎nashorn使用实例
Java8 更新了JavaScript引擎,从Mozilla Rhino,改为使用nashorn,下面是一个实例。
近期部门要开发一款设备的测试工具,测试的流程比较复杂且不固定,如果在Java代码中写出固定流程的话就不够灵活。所以决定用JS脚本来描述流程,用Java实现具体的业务功能。Java解析JS的引擎自然使用最新的nashorn,下面贴出代码。
Java调用JS脚本的代码:
import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException; import javax.script.SimpleBindings; public class JSTesterCallFunctions { public static void main(String[] args){ ScriptEngineManager scriptEngineManager = new ScriptEngineManager(); ScriptEngine nashorn = scriptEngineManager.getEngineByName("nashorn"); try{ for(int i = 0; i < args.length; i++){ File file = new File(args[i]).getAbsoluteFile(); System.out.println("args[" +i+ "] is" + file); if(file.isFile()){ String strJSName = args[i];// For Jar nashorn.eval(new FileReader(strJSName )); Object eval = nashorn.eval("make("" + strJSName + "")");// 传递参数strJSName到JS脚本 else{ System.out.println("Java运行命令参数非法,请检查!"); } } } catch (ScriptException | FileNotFoundException e) { System.out.println("Error executing script: " + e.getMessage()); } } }
上面的Java代码是程序启动的主程序,可以main函数的参数args[]传入JS脚本的名字,而且可以传入多个JS脚本,逐一执行。
在调用JS脚本中的make函数时,将JS脚本的名字作为参数传入,方便在后面的代码中,根据不同的JS脚本分别产生日志文件。即每个JS脚本可以对应一个日志文件,方便查看。
JS脚本内容:
function make(JSName) { //Java代码中定义的,用来建立SOCKET连接的类 var KMT2KMS = Java.type("com.kmt.functions.KMTConnectToKMS"); // Java ArrayList类型定义 var ArrayList = Java.type("java.util.ArrayList"); /** * Server信息 */ var serverIP = "10.88.104.44"; var serverPort = 8007; var keySizeReportTimer = 5000; //定义设备数量 var kmtNum = 3; var kmts = new Array(kmtNum); for(var i=0; i<kmtNum; i++){ //每个kmt应该有不同的名字,再for后面的离网时,通过对象名调用离网 kmts[i] = new KMT2KMS(JSName, serverIP, serverPort); kmts[i].sslConnection();//kmt的对象,调用kmt的成员函数 } //在JS脚本中如何使用Java ArrayList类型 for(var i=0; i<kmtNum; i++){ //定义Java的ArrayList, var keyPairSizeList = new ArrayList(); keyPairSize = kmtNum; for(var j=0; j<keyPairSize; j++){ var keySizeTargetId = startId + j; if(kmts[i].startId == keySizeTargetId){//如果keySizeTargetId与本KMT startId相等,则跳过继续 continue; } var sendKey = 100; var recKey = 100; var keySizeInfo = new KeySizeInfo(keySizeTargetId, sendKey, recKey); keyPairSizeList.add(keySizeInfo) } //在keySizeReportTimer时间后,执行该函数,在java代码中sleep对应时间 kmts[i].keySizeReport(keySizeReportTimer, keyPairSizeList); } /** * 设备离网 */ for(var k=0; k<kmtNum; k++){ kmts[k].kmtDisconnectKMS(3000); } }
在JS代码中可以定义Java类的对象,然后通过对象调用对应的函数。测试流程可以在JS中灵活描述,方便工具后期的使用。
刚开始用也不是很熟悉,欢迎大家点评: )
项目组其他同事使用MQ比较多,也是一款开源的JS脚步调用Java程序的工具,感兴趣可以研究一下。
对了,关于根据JS文件名记录到不同的日志文件,后期会在Log4j2的内容中总结,当然Log4j1也可以做到这一点。
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
- 上一篇: 在Java中直接调用js代码
- 下一篇: java 解析js脚本