在JavaScript风靡的时代,很多语言都想和它发生点关系,以便可以让自己看的更加的简单和高效。然而并不是所有的JavaScript引擎都设计地很合理和简单。这里将介绍两款将Java转化为JavaScript的工具。他们一个是新星,一个是业界老大哥。
GWT的出现是为了解决JavaScript无法编译,不易调试的问题,开发人员通过编译运行Java代码,就可以轻松地生成复杂高效的JS代码,并不需要再通过浏览器的调试而是编译调试Java来替代。同时,GWT的RPC性能也十分优越,可以调用远程方法完成本地AJAX客户端的开发。在本地JNI代码中直接使用JavaScript对象也是他的一大特色。看下面的代码:
1 GWT通过jsni调用内部js
Button button = new Button("java调用内部jsni的js方法"); button.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { //gwt中java调用js方法 execute("js方法被调用"); } }); /** * JSNI方法 * @param id */ public static native void execute(String str) /*-{ alert(str); }-*/;
2 内部js通过jsni调用java方法
Button button1 = new Button("内部jsni的js调用java方法"); button1.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { //gwt中java调用js方法 executeJs("java方法被调用"); } }); /** * JSNI方法, 里面调用java方法 javaAlert * @param id */ public static native void executeJs(String str) /*-{ @com.hw.client.TestCall::javaAlert(Ljava/lang/String;)(str); }-*/;
这两段代码演示了GWT中Java与JS语言之间的相互调用,通过jsni--gwt的js本地接口。说白了,就是在Java中写JS代码,很酷吧。
现在看下Nashorn的表现。Nashorn是运行在JVM上的Javascript引擎。主要用于实现服务器端的js,这一点和node.js很像(顺便说一句,oracle已经有了它自己的Node.js实现,叫Node.jar)。他可以实现js与java对象和方法的互相调用,真正实现了java与js的互通有无的功能。
ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("nashorn"); String js; js = "var map = Array.prototype.map \n"; js += "var names = [\"john\", \"jerry\", \"bob\"]\n"; js += "var a = map.call(names, function(name) { return name.length() })\n"; js += "print(a)"; engine.eval(js);
js += "var a = map.call(names, function(name) { return Java.type("LambdaTest”).wrap(name.length()) })";
上面两段代码展示了Nashorn的使用方法。工厂方法模式设计的引擎管理器从堆中找出名为Nashorn的引擎。然后就可以通过eval函数输出js代码。并且在lambda表达式中返回他的类型。
综上所述,两者都是实现了java对象与js对象的共享。实现了后台向前端的技术迁移,也告诉了我们今后的领域发展方向:一切皆为JavaScript~