?????? 好久没去IBM的developerworks了,今天去看了下,发现这么个新鲜的东东: Java6.0中支持JavaScript. 呵呵,?有意思, 试试,于是在eclipse里照着IBM里的教程小跑了下那个程序,出结果了. 其中Java程序如下:
?
public class ScriptDemo { public static void main(String args[]) throws Exception { // Get the JavaScript engine ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("JavaScript"); // Set JavaScript variables Bindings vars = new SimpleBindings(); vars.put("demoVar", "value set in ScriptDemo.java"); vars.put("strBuf", new StringBuffer("string buffer")); // Run DemoScript.js Reader scriptReader = new InputStreamReader( ScriptDemo .class.getResourceAsStream("DemoScript.js")); try { engine.eval(scriptReader, vars); } finally { scriptReader.close(); } // Get JavaScript variables Object demoVar = vars.get("demoVar"); System.out.println("[Java] demoVar: " + demoVar); System.out.println(" Java object: " + demoVar.getClass().getName()); System.out.println(); Object strBuf = vars.get("strBuf"); System.out.println("[Java] strBuf: " + strBuf); System.out.println(" Java object: " + strBuf.getClass().getName()); System.out.println(); Object newVar = vars.get("newVar"); System.out.println("[Java] newVar: " + newVar); System.out.println(" Java object: " + newVar.getClass().getName()); System.out.println(); } }
?要执行的javaScript如下:
?
println("Start script \r\n"); // Output the type of an object function printType(obj) { if (obj.getClass) println(" Java object: " + obj.getClass().name); else println(" JS object: " + obj.toSource()); println(""); } // Print variable println("[JS] demoVar: " + demoVar); printType(demoVar); // Call method of Java object strBuf.append(" used in DemoScript.js"); println("[JS] strBuf: " + strBuf); printType(strBuf); // Modify variable demoVar = "value set in DemoScript.js"; println("[JS] demoVar: " + demoVar); printType(demoVar); // Set a new variable var newVar = { x: 1, y: { u: 2, v: 3 } } println("[JS] newVar: " + newVar); printType(newVar); println("End script \r\n");
?
?? 运行后是出结果了, 但发现一些问题,想了想也没解决,写在这里希望能有更多的人一起来讨论:
????? 1, javaScript里的println是谁的方法? Java的? 还是JavaScript里的? 好像是Java的, 是像在jsp里可能直接访问application 等这些对象那样可以直接调用System.out的println方法? 都还有什么Java方法可以在JavaScript里直接调用? 这些方法在javaScript文件中怎么就不能再在浏览器直接运行javaScript方法那样了吧? 毕竟浏览器是不认识方法println的.另外看来也是完全像在Java里那样调用StringBuffer里append方法: strBuf.append(" used in DemoScript.js");? 那能不能这样: 在一个辍名为js的文件里写的全是java语句,再在别的真正Java程序里eval这个貌为js的Java文件,这样岂不是达到了动态编译的目地?像在JavaScript里的eval那样.
???? 2, printType方法的obj.getClass看起来既熟悉又陌生: 熟悉的是在Java里我们可以调用一个对象的getClass()来获得它的类信息,陌生的是这个调用没有一个方法应有的明显特征括号.又是在javaScript里可以按javascript的语法特性来调用Java里的方法: 也就是把Object类的getClass方法当成JavaScript里的一个属性.接下来又有obj.getClass(),是不是说即可以以Java的语法来调用也可以模仿JavaScript里的语法特性来调用?
??? 3, 是不是在背后Java与JavaScript的过滤上有个类似于jsp里的pageContent这样的一个对象来作为一些临时变量的中转站?
??? 4, 这样的feature能有什么具体的用处?会像Java与groovy的结合那样来做到不启动服务器就可以直接来更改需求?IBM的教程里有这样一句话"If
your script implements all the methods of a Java interface, you can also use
getInterface()
to obtain a Java object whose methods are coded in
the scripting language. "是否就意味着可以用javaScript来实现Java里的一个接口? 那么这个接口的实现具体又有什么语法新特性?
不会在javaScript里出现关键字implements吧? getInterface
()调用返回的接口怎么指定? 也就是说JVM怎么知道能有什么接口可以get?
??? 5, 是不是会有人根据这个特性写一个更加灵活的web开发框架???
??? 6, JDK6.0中有了这个对JavaScript的支持,是否会像当初Ajax那样掀起JavaScript学习使用热潮?