我可以使用ScriptableObject在Java中构建Rhino JavaAdapter吗?
问题描述:
我发现了一些关于使用Mozilla的Rhino在Javascript和Java之间对类定义进行混洗的问题。我已经得到了足够远,这种工作原理:我可以使用ScriptableObject在Java中构建Rhino JavaAdapter吗?
的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的构造函数不带任何参数,有没有任何文件为任何地方的类(例如,它不是here),我还没有找到任何静态方法(例如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'超类字段/变量。我猜这是预期的行为?我只是添加了愚蠢的单线getter和setter,但似乎不应该有必要。 – Coderer 2013-06-10 12:36:11