日期:2014-05-16  浏览次数:20395 次

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("[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那样掀起J