Make it Better
java和js互相调用实现类似NPC等热部署event的方法
2017-3-3 StanWind


这里举个简单的计次的例子



新建一个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










发表评论:
昵称

邮件地址 (选填)

个人主页 (选填)

内容