我发现了一些关于使用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),并且我没有找到任何静态方法(例如在Context
或ScriptableObject
)上创建这样的类。我也试过了Context.jsToJava(o, MyClass.class)
,但这引起了异常。
答案 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中的方法和字段也必须是公共的而不是受保护的(也是不幸的)。