作者:idc01 | 来源:互联网 | 2023-01-29 11:00
执行复杂逻辑的代码,debug是避免不了的。在java中引入js脚本用来做业务逻辑的动态定制修改,我们用的是jdk1.8的nashorn引擎。本文章,参考了http:
执行复杂逻辑的代码,debug是避免不了的。在java中引入js脚本用来做业务逻辑的动态定制修改,我们用的是jdk1.8的nashorn引擎。
本文章,参考了
http://hevi.info/programming-language/java/java-1-8-Javascript-engine-nashorn-debugging-Javascript-file/
https://blog.jetbrains.com/idea/2014/03/debugger-for-jdk8s-nashorn-Javascript-in-intellij-idea-13-1/
经过测试,必须使用intellij去debug 启动java代码,同时用scriptEngine.eval("load('" + JsfileName + "');");的方式,才可以在js文件打断点。
public class MainTest {
@Test
public void testScript() {
ScriptEngineManager engineManager = new ScriptEngineManager();
ScriptEngine scriptEngine = engineManager.getEngineByName("nashorn");
String fileName = "src/main/resources/jsfile.js";
String functiOnName= "doIt";//js文件中的待执行函数名
try {
scriptEngine.put("xxx",123);//传入js中的上下文变量
scriptEngine.eval("load('" + fileName + "');");
Invocable inv = (Invocable) scriptEngine;
String retValue = (String) inv.invokeFunction(functionName, new MainTest());
System.out.println(fileName + "@" + functionName + " returned " + retValue);
} catch (ScriptException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
}
jsfile.js
function doIt(param) {
print(xxx);
var message = "hello world " + param.getClass().getName() + "!";
return message;
}
这边,在使用eval加载了js脚本之后,用Invocable 的invokeFunction去直接调用js的函数。可以直接下载附件,直接跑demo。