Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Rhino Javascript中共享java对象_Java_Javascript_Rhino - Fatal编程技术网

在Rhino Javascript中共享java对象

在Rhino Javascript中共享java对象,java,javascript,rhino,Java,Javascript,Rhino,首先,让我承认我是JavaScript的noob。因此,这个问题在基础上可能不太合理,可能缺乏足够的信息来帮助我 背景 我的组织有一个内部基于Eclipse的JavaScript IDE。我们所要做的就是用JavaScript编写脚本并直接执行它们。我猜它使用Rhino,因为我在一些异常的堆栈跟踪中看到了它 我的代码运行在3个“.js”文件上 脚本1:声明全局变量并将其实例化为Java对象 importClass(java.util.HashMap); var hmTCResult = new

首先,让我承认我是JavaScript的noob。因此,这个问题在基础上可能不太合理,可能缺乏足够的信息来帮助我

背景 我的组织有一个内部基于Eclipse的JavaScript IDE。我们所要做的就是用JavaScript编写脚本并直接执行它们。我猜它使用Rhino,因为我在一些异常的堆栈跟踪中看到了它

我的代码运行在3个“.js”文件上

脚本1:声明全局变量并将其实例化为Java对象

importClass(java.util.HashMap);
var hmTCResult = new HashMap();
脚本2:使用脚本1中的全局变量执行一些操作

Script-2.prototype.run = function() {
hmTCResult.put("Result", "Fail");
};

changeStatus = function(strStatus){
hmTCResult.put("Result", strStatus);
};
Script-3:在Script-2中使用全局变量调用函数

changeStatus("Pass") 
问题定义 当我从Script-3调用Script-2中的函数时,它似乎没有选择实例变量,并且我的函数失败,即我得到一个异常“hmTCResult未设置为对象的实例”。请注意,相同的变量hmTCResult在脚本1中运行良好

我已经阅读了一些JavaScript中的作用域和上下文,但由于没有在IDE中显式地看到它,因此无法突破它


如果需要,我很乐意提供更多信息。

要评估Java中的js脚本,可以执行以下操作

ScriptEngine engine = new ScriptEngineManager().getEngineByMimeType( "text/javascript" );
Bindings bindings = engine.getBindings( ScriptContext.GLOBAL_SCOPE );
bindings.put( "varname", ... );
bindings.put( ... );
engine.put( ScriptEngine.FILENAME, script.toString());
engine.eval( new FileReader( script ));
如果这3个脚本加载在同一个引擎/绑定中,则没有问题,但如果新分配了引擎以执行script3,则上下文已被清除


这篇文章并不是一个真正的答案,但太长了,不能作为评论。

我想,在没有更多信息的情况下,假设你修改的成绩单是绝对正确的,你的脚本是在单独的作用域中运行的,所有这些都是以全局作用域作为父级的

因此,我猜想第三个脚本中
changeStatus
起作用的原因是因为没有
var
声明。因此,在没有其他配置的情况下,这将被定义为在三个脚本之间共享的顶级或全局范围中的变量


我猜想
hmTCResult
不起作用的原因是它是用关键字
var
声明的,表示一个局部变量。如果所有脚本都在顶级作用域中运行,这将在全局对象上定义一个变量。但是,如果每个脚本都在自己的作用域中运行,那么这将只在脚本1的作用域中定义一个变量。您不会在脚本2的范围内看到问题,因为在脚本3执行之前,没有人在脚本2中执行代码。

这很好,只需调整范围并设置原型搜索:

Context cx = Context.enter();
try {
    // Cache and reuse:
    ScriptableObject sealedSharedScope = cx.initStandardObjects(null,
            true);
    // Force the LiveConnect stuff to be loaded.
    String loadMe = "RegExp; getClass; java; Packages; JavaAdapter;";
    cx.evaluateString(sealedSharedScope, loadMe, "preLoadLazyLoad", 0,
            null);

    cx.evaluateString(sealedSharedScope, "varInRoot = 'blah';",
            "setVarInRoot", 0, null);

    // here you can put more cx.evaluateString calls to set up your
    // environment (eg. hmTCResult)

    // now connect a throw-away new scope into the hierarchy, with local
    // vars:
    Scriptable scope = cx.newObject(sealedSharedScope);
    // ensure that definitions in the root scope are found
    scope.setPrototype(sealedSharedScope);
    // ensure that new global variables are created in this scope (don't
    // use
    // var for them!)
    scope.setParentScope(null);

    cx.evaluateString(scope, "localVar = varInRoot;", "mySource", 0,
            null);
    assertEquals("blah", scope.get("localVar", scope).toString());
    // new var not in root:
    assertEquals(ScriptableObject.NOT_FOUND,
            sealedSharedScope.get("localVar", scope));
} finally {
    Context.exit();
}
注意这个范围。get不会搜索原型链-必须自己搜索


作用域独立于上下文并在Context.exit()中生存。

我认为没有任何“Java”对象共享,这对您很重要。请向我们展示您的代码的相关部分,即脚本2中该函数的声明,脚本3中的调用,并指向您希望使用但无法向我们提供一些代码的变量?问题随代码更新。对不起,我不能提供完整的代码。提前感谢您的帮助。我没有使用Java/Rhino的经验,但是
Script-2
不是有效的JavaScript标识符。将其命名为
Script2
Script\u 2
。谢谢Ian,但提到的脚本名称仅用于说明。实际的脚本名称非常有效。谢谢Aubin。正如我所提到的,尽管我的工具基于Eclipse,但其功能更像JavaScript IDE。我没有在工具中看到Java代码。好吧,我不明白。我通过删除Java重新标记了你的问题,因为它不适用。Aubin,我不同意。如果您看到我的问题,我正在JavaScript中使用Java类。因此标记Java是相关的。