2012-07-26 50 views
1

我发现了一些关于使用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),我还没有找到任何静态方法(例如ContextScriptableObject )创建这样一个类。我也试过Context.jsToJava(o, MyClass.class),但是引发了一个例外。

回答

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

+0

我知道这是一个古老的问题,但我仍然有点在这工作。值得注意的是:我发现我的'JavaInterface''d“subclass”可以调用'protected'超类方法,但不能访问'protected'超类字段/变量。我猜这是预期的行为?我只是添加了愚蠢的单线getter和setter,但似乎不应该有必要。 – Coderer 2013-06-10 12:36:11

相关问题