【问题标题】:Can I build a Rhino JavaAdapter in Java, using a ScriptableObject?我可以使用 ScriptableObject 在 Java 中构建 Rhino JavaAdapter 吗?
【发布时间】:2012-07-25 05:29:18
【问题描述】:

我发现了一些关于使用 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!"

这让我大吃一惊,但我想将 JavaAdapter 结构从 Javascript 转移到 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 构造函数不带任何参数,任何地方都没有该类的文档(例如,它不是here),而且我还没有找到任何静态方法(例如ContextScriptableObject) 创建了这样一个类。我也试过Context.jsToJava(o, MyClass.class),但抛出了异常。

【问题讨论】:

    标签: java javascript rhino


    【解决方案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 调用(即从 foo 调用 Java)来访问 MyClass 的超级方法和字段似乎总是需要 'this' 关键字。我仍在试图弄清楚这一点。 MyClass 中的方法和字段也必须是公共的,而不是受保护的(也很不幸)。

    【讨论】:

    • 我知道这是一个古老的问题,但我仍在努力解决这个问题。注意:我发现我的JavaInterface'd“子类”可以调用protected 超类方法,但不能访问protected 超类字段/变量。我想这是预期的行为?我只是添加了愚蠢的单行 getter 和 setter,但似乎没有必要。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-15
    • 1970-01-01
    • 1970-01-01
    • 2020-09-09
    • 2015-11-14
    • 1970-01-01
    相关资源
    最近更新 更多