我可以建立一个犀牛JavaAdapter的在Java中使用是ScriptableObject?(Ca

2019-10-17 01:48发布

我发现约洗牌使用Mozilla Rhino的JavaScript和Java之间的类定义了几个问题。 我已经得到了足够远,这种工作原理:

使用Javascript:

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

Java的

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!"

这把我吓倒了,但我想从JavaScript移动JavaAdapter的建设Java端。 我正在写一个框架,用户将在JavaScript中定义的逻辑,和他们有他们就会越幸福粘贴较少的样板。

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

使用Javascript:

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

Java的

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的构造函数不带任何参数,有该类没有文档的任何地方(例如,它不是在这里 ),我还没有发现任何静态方法(例如,在ContextScriptableObject ),其创建这样一个类。 我也试过Context.jsToJava(o, MyClass.class)但引发了异常。

Answer 1:

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

改变你的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调用(即从富调用Java)来访问MyClass的超级方法和字段似乎总是要求“这个”关键字。 我仍然在试图找出答案。 方法和字段MyClass中也必须是公众,而不是受保护的(也是不幸的)。



文章来源: Can I build a Rhino JavaAdapter in Java, using a ScriptableObject?