Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.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
如何从javascript调用java方法_Java_Javascript_Rhino - Fatal编程技术网

如何从javascript调用java方法

如何从javascript调用java方法,java,javascript,rhino,Java,Javascript,Rhino,如标题所述,我正在努力实现以下目标: 创建java对象 将其传递给JavaScript 对传递的对象调用方法(例如setter) 继续使用java中的对象 我正在使用java中包含的脚本。 如果有人能帮我,我会很高兴的。如果您使用的是ScriptEngine框架,这真的很容易。您可以通过两种方式将Java对象“传递”到JavaScript: 您可以为JavaScript代码“播种”执行环境,并将Java对象安排在全局名称空间中 您可以将Java对象作为参数传递给JavaScript函数 如果需要

如标题所述,我正在努力实现以下目标:

  • 创建java对象
  • 将其传递给JavaScript
  • 对传递的对象调用方法(例如setter)
  • 继续使用java中的对象
  • 我正在使用java中包含的脚本。
    如果有人能帮我,我会很高兴的。

    如果您使用的是ScriptEngine框架,这真的很容易。您可以通过两种方式将Java对象“传递”到JavaScript:

  • 您可以为JavaScript代码“播种”执行环境,并将Java对象安排在全局名称空间中
  • 您可以将Java对象作为参数传递给JavaScript函数
  • 如果需要,还可以从JavaScript访问Java构造函数并实例化Java对象

    要做第一件事,必须为脚本引擎设置“绑定”。它就像一张地图:

    final Bindings globals = engine.createBindings();
    globals.put("foo", yourObject);
    
    现在,当JavaScript代码在该引擎中运行时,全局符号“foo”将用作对Java对象的引用。您可以绑定任意数量的引用

    如果要将Java对象作为参数传递给JavaScript函数,首先需要一种调用JavaScript函数的方法。为此,您可以使用“Invocable”接口公开的“invokeFunction”或“invokeMethod”方法:

    final Object result = ((Invocable) engine).invokeMethod(context, methodName, arg, arg, ... );
    
    “上下文”只是一个引用,您希望在调用的函数中引用它。“methodName”只是一个字符串,给出了全局JavaScript函数的名称

    Java类通过其完全限定的路径名可用于JavaScript环境:

    var javaHashMap = new java.util.HashMap();
    

    这将为您提供一个Java HashMap实例作为JavaScript变量。

    您能提供一个简单的代码吗?现在我对key和object使用“put”,但不确定这是否是您所说的方式。我还有一个问题——进口包装。我知道在rhino中您只需添加scope=newimporterTopLevel(cx),但如何在ScriptEngine中实现这一点呢?非常感谢您的帮助。我现在使用的是你解释的第一种方法。但是当我试图从js访问foo.getFooName()时,它告诉我foo是未定义的。如果我从js中实例化一个对象,同样的方法也会起作用。很抱歉打扰您,我只需要设置scope->engine.setBindings(globals,ScriptContext.engine\u scope);现在一切都很完美。再次感谢您的帮助。啊,是的-对不起,我正在查看去年为我的应用程序编写的“包装器”代码,所以我可能错过了重要的一步:-)很高兴它现在对您有效!