java和js互相调用实现类似NPC等热部署event的方法
首页 > 后端开发    作者:StanWind   2017年3月3日 4:07 星期五   热度:2820°   百度已收录  
时间:2017-3-3 4:07   热度:2820° 

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

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





二维码加载中...
本文作者:StanWind      文章标题: java和js互相调用实现类似NPC等热部署event的方法
本文地址:https://www.stanwind.com/post/48
版权声明:若无注明,本文皆为“Make it Better”原创,转载请保留文章出处。

返回顶部    首页    手机版本    后花园  
版权所有:Make it Better    站长: StanWind    赣ICP备17014296号