这里举个简单的计次的例子
新建一个client对象
用java调用指定js 在js里调用client的add方法
Client.java
public class Client {
private int count = 0;
public int getCount(){
return count;
}
public void setCount(int count){
this.count = count;
}
public int add(){
count++;
return count;
}
}
Main.java
public static void main(String[] args) throws Exception {
Client client = new Client();
ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
//第一种写法 不需要传参的js 通过engine提前置入java对象
String code = "function add(){ client.add();}"; //定义js代码 可以配置成读入脚本
//第二种写法 传入对象
//String code = "function add(client){ client.add();}"; //定义js代码 可以配置成读入脚本
//开始拿到invoke
ScriptEngine scriptEngine = scriptEngineManager.getEngineByName("javascript"); //拿到执行engine
scriptEngine.eval(code); // 置入代码
//第一种写法 提前往js里置入java对象
scriptEngine.put("client",client);
Invocable invocable = (Invocable)scriptEngine; // 拿到执行对象
System.out.println("Before Invoke->" + client.getCount());
//第一种执行
invocable.invokeFunction("add");
//第二种执行
//invocable.invokeFunction("add",client);
System.out.println("Add Invoke->" + client.getCount());
}
大致思路就如上了
在这里可以新建一个抽象类 提供一个getInvoke方法比较实用
// /**
// * 读取指定路径执行JS
// * @param client
// * @param scriptEngineManager
// * @param path
// * @return
// */
// public Invocable getInvocable(Client client,ScriptEngineManager scriptEngineManager,String path){
// //开始拿到invoke
// ScriptEngine scriptEngine;
// try {
// path = "scripts/" + path;
// scriptEngine = null;
//
// if (scriptEngine == null) {
// File scriptFile = new File(path);
// if (!scriptFile.exists()) {
// return null;
// }
// scriptEngine = scriptEngineManager.getEngineByName("javascript");
//
// FileReader fr = new FileReader(scriptFile);
// scriptEngine.eval(fr);
// fr.close();
// }
// return (Invocable) scriptEngine;
// } catch (Exception e) {
// //log.error("Error executing script. Script file: " + path + ".", e);
// return null;
// }
//}
源码地址:https://git.oschina.net/lovewestwind/JsJava