2012-07-26 108 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

相關問題