Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/457.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
我可以使用ScriptableObject在Java中构建Rhino JavaAdapter吗?_Java_Javascript_Rhino - Fatal编程技术网

我可以使用ScriptableObject在Java中构建Rhino JavaAdapter吗?

我可以使用ScriptableObject在Java中构建Rhino JavaAdapter吗?,java,javascript,rhino,Java,Javascript,Rhino,我发现了一些关于使用Mozilla的Rhino在Javascript和Java之间混合类定义的问题。我已经走得够远了,这是可行的: Javascript: new JavaAdapter(MyClass, {foo: function(){return 'Hello!';}}); {foo: function(){return 'Hello!';}}; 爪哇 这让我大吃一惊,但我想将JavaAdapter结构从Javascript移到Java端。我正在编写一个框架,在这个框架中,用户将用Ja

我发现了一些关于使用Mozilla的Rhino在Javascript和Java之间混合类定义的问题。我已经走得够远了,这是可行的:

Javascript:

new JavaAdapter(MyClass, {foo: function(){return 'Hello!';}});
{foo: function(){return 'Hello!';}};
爪哇

这让我大吃一惊,但我想将JavaAdapter结构从Javascript移到Java端。我正在编写一个框架,在这个框架中,用户将用Javascript定义逻辑,他们粘贴的样板文件越少,他们就会越高兴

理想情况下,我可以这样做:

Javascript:

new JavaAdapter(MyClass, {foo: function(){return 'Hello!';}});
{foo: function(){return 'Hello!';}};
爪哇


但据我所知,JavaAdapter构造函数不带任何参数,任何地方都没有该类的文档(例如,它没有),我也没有找到任何创建此类的静态方法(例如,在
Context
ScriptableObject
)。我还尝试了
Context.jsToJava(o,MyClass.class)
,但这引发了一个异常。

我也一直在思考这个问题。我终于做到了:

将您的JavaScript更改为:

var xyz = {foo: function() {return 'Hello!';}};
现在,用以下代码替换创建JavaAdapter的单行代码:

String stub = "new JavaAdapter(Packages.MyClass, xyz);";
Object o = context.evaluateString(scope, stub, "stub", 1, null);
MyClass mc = (MyClass) Context.jsToJava(o, MyClass.class);
我不是这方面的专家,但您似乎不能直接从Java代码使用JavaAdapter(很不幸),但我们可以运行一段存根代码从JavaScript调用它

在我的例子中,要注意打字错误,我是从我的工作代码中翻译出来的


调用MyClass mc实例似乎工作正常。从JavaScript调用(即从foo调用Java)来访问MyClass的超级方法和字段似乎总是需要“this”关键字。我还在想办法。MyClass中的方法和字段也必须是公共的,而不是受保护的(也很不幸)。

我知道这是一个古老的问题,但我仍在努力解决这个问题。注意:我发现我的
JavaInterface
'd“subclass”可以调用
protected
超类方法,但不能访问
protected
超类字段/变量。我猜这是预期的行为?我只是添加了一些愚蠢的一行能手和二传手,但似乎这不必要。