有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Nashorn是否返回本机JavaScript对象?

我目前正在使用Rhino的javax实现。默认情况下,Rhino使用包装器返回Java对象。Nashorn是否有类似的行为,或者默认情况下是否返回JavaScript对象

谢谢


共 (2) 个答案

  1. # 1 楼答案

    看起来它尽最大努力返回可感知的对象。使用此代码,然后更改XXX:

    ScriptEngineManager mgr = new ScriptEngineManager();
    ScriptEngine engine = mgr.getEngineByName("nashorn");
    engine.eval("function test() { return XXX; };");
    Object result = ((Invocable)engine).invokeFunction("test");
    System.out.println(result.getClass().getName());
    

    收益率:

    return 'hello world' = java.lang.String
    return 1 = java.lang.Integer
    return { name: 'Hello' } = jdk.nashorn.api.scripting.ScriptObjectMirror
    
  2. # 2 楼答案

    看起来是这样的,即使Java对象可以在JS代码中使用,它仍然引用Java对象(尽管它们显示为函数对象,因此必须有一个包装器),我们不能将它们视为Javascript对象:

    //"import"
    var StringTokenizer = java.util.StringTokenizer;
    
    print(typeof StringTokenizer);
    
    var st = new StringTokenizer("this is a test");
    
    print(typeof st);
    java.util.StringTokenizer.prototype.name = 'myST';
    
    print(st.name);
    

    结果如下:

    testObj.js:9 TypeError: Cannot set property "name" of undefined
    

    现在Javascript对象将作为“jdk.nashorn.internal.scripts.JO”实例加载

    *如果您想更轻松地测试上述代码,只需为JDK的jjs(Nashorn解释器)创建一个别名,例如,如果您创建一个名为test.js的文件,您可以使用以下工具运行该程序:

    $ jjs test.js
    

    Mac OS=alias jjs=’/Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home/jre/bin/jjs’

    Windows=定义一个名为“JAVA8_HOME”的环境变量并指向您的jdk8文件夹,然后您可以通过运行以下命令调用jjs:

    > “%JAVA8_HOME%\jre\bin\jjs” test.js