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

时间:2012-07-26 15:16:01

标签: java javascript rhino

我发现了一些关于使用Mozilla的Rhino在Javascript和Java之间改组类定义的问题。我已经足够了,这很有效:

使用Javascript:

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

爪哇

String script = // the above stuff
Object o = context.evaluateString(scope, script, "UserScript", 1, null);
MyClass mc = (MyClass) Context.jsToJava(o, MyClass.class);
mc.foo(); // returns "Hello!"

这让我感到震惊,但我想将JavaAdapter结构从Javascript移到Java端。我正在编写一个框架,用户将在Javascript中定义逻辑,并且他们必须粘贴的模板越少,他们就会越快乐。

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

使用Javascript:

{foo: function(){return 'Hello!';}};

爪哇

String script = // the above stuff
Object o = context.evaluateString(scope, script, "UserScript", 1, null);
MyClass mc = new JavaAdapter(MyClass.class, o);
mc.foo(); // returns "Hello!"

但据我所知,JavaAdapter构造函数不接受任何参数,在任何地方都没有该类的文档(例如,它不是here),并且我没有找到任何静态方法(例如在ContextScriptableObject)上创建这样的类。我也试过了Context.jsToJava(o, MyClass.class),但这引起了异常。

1 个答案:

答案 0 :(得分:2)

我也一直在打这个。我终于得到了这个工作:

将您的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中的方法和字段也必须是公共的而不是受保护的(也是不幸的)。