rmn190 发表于 2013-1-23 02:56:09

JavaScript在Java里执行?

       好久没去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(" demoVar: " + demoVar);      System.out.println("    Java object: " + demoVar.getClass().getName());      System.out.println();      Object strBuf = vars.get("strBuf");      System.out.println(" strBuf: " + strBuf);      System.out.println("    Java object: " + strBuf.getClass().getName());      System.out.println();      Object newVar = vars.get("newVar");      System.out.println(" newVar: " + newVar);      System.out.println("    Java object: " + newVar.getClass().getName());      System.out.println();    }} 要执行的javaScript如下:
 
println("Start script \r\n");// Output the type of an objectfunction printType(obj) {    if (obj.getClass)      println("    Java object: " + obj.getClass().name);    else      println("    JS object: " + obj.toSource());    println("");}// Print variableprintln(" demoVar: " + demoVar);printType(demoVar);// Call method of Java objectstrBuf.append(" used in DemoScript.js");println(" strBuf: " + strBuf);printType(strBuf);// Modify variabledemoVar = "value set in DemoScript.js";println(" demoVar: " + demoVar);printType(demoVar);// Set a new variablevar newVar = { x: 1, y: { u: 2, v: 3 } }println(" 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学习使用热潮?
页: [1]
查看完整版本: JavaScript在Java里执行?