2012-10-23 23 views
4

我一直在尋找的犀牛documentationsource code的線索就如何實現自己的全球原生功能。然而,這項任務比我預期的要複雜得多。如何在犀牛創建的本機的功能呢?

閱讀require功能的RingoJS實施,我相信我需要做的大意如下的東西的code後:

import org.mozilla.javascript.BaseFunction; 
import org.mozilla.javascript.Scriptable; 
import org.mozilla.javascript.Context; 

public class MyGlobalNativeFunction extends BaseFunction { 
    public MyGlobalNativeFunction() {} 

    public Object call(Context cx, Scriptable scope, Scriptable thisObj, Object[] args) { 
     // implementation of my function 
    } 

    public int getArity() { 
     return 1; 
    } 
} 

上午我正確的軌道上?如何實現這一步一步一步的演練將是非常棒的。

而且這將是巨大的,如果我可以使用Rhino的defineClass函數來創建我的全球原生功能。我不是推出犀牛我自己修改過的版本,只是因爲我想要實現一個本地函數過於激烈。

回答

4

我認爲這應該工作,如果你只是想實現一個單一的全球性功能這是一個不錯的辦法。如果你想實現多個函數或主機對象,還有其他方法。

,那麼你會使用這樣的實例化你的函數:

scope.defineProperty("myNativeFunction", 
        new MyGlobalNativeFunction(), 
        ScriptableObject.DONTENUM); 

退房RingoGlobal對於如何做到這一點(它也顯示瞭如何在一個掃定義多種功能,而無需創建一個類爲每個)。該Rhino examples directory包含如何犀牛創造適當的主機對象的一些例子。

+0

我假設'scope'是全球範圍內,對不對?我在哪裏實例化它,以及如何訪問'範圍'?我看到'RingoGlobal'有一個叫'init'的方法。 –

4

首先,您需要初始化您的全局作用域(初始化所有JavaScript標準對象,函數等),然後按照HannesWallnöfer的說法將函數添加到此作用域。

Context cx = Context.enter(); //enter rhino context - bind context with current thread 
Scriptable globalScope= cx.initStandardObjects(); //init js standard object in global scope 
globalScope.defineProperty("myNativeFunction", 
        new MyGlobalNativeFunction(), 
        ScriptableObject.DONTENUM); 

就是這樣。

我們調用這個函數調用:

Object result = cx.evaluateString(globalScope, "myNativeFunction()", "<cmd>", 1, null); 

欲瞭解更多信息,請參閱:rhino embedding tutorial