4

独自のグローバル ネイティブ関数を実装する方法の手がかりとして、Rhino のドキュメントソース コードを調べてきました。しかし、この作業は私が予想していたよりも複雑です。

RingoJSの関数の実装のコードを読んだ後、次の行に沿って何かを行う必要があると思います。require

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;
    }
}

私は正しい軌道に乗っていますか?これを達成する方法についての段階的なウォークスルーは素晴らしいでしょう。

defineClassまた、Rhino の関数を使用してグローバル ネイティブ関数を作成できれば素晴らしいと思います。1 つのネイティブ関数を実装したいという理由だけで、Rhino の独自の修正バージョンをロールアウトすることにあまり熱心ではありません。

4

2 に答える 2

4

これはうまくいくはずだと思います。単一のグローバル関数のみを実装したい場合は、それが良いアプローチです。複数の関数またはホストオブジェクトを実装する場合は、他の方法があります。

次に、次のようなものを使用して関数をインスタンス化します。

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

これがどのように行われるかについては、 RingoGlobalを確認してください(それぞれにクラスを作成せずに、1回のスイープで複数の関数を定義する方法も示しています)。Rhinoのexamplesディレクトリには、 Rhinoを使用して適切なホストオブジェクトを作成する方法の例がいくつか含まれています。

于 2012-10-24T06:49:35.537 に答える
4

まず、グローバル スコープを初期化する必要があります (すべての JavaScript 標準オブジェクト、関数などを初期化します)。次に、Hannes Wallnö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 埋め込みチュートリアル

于 2012-10-27T14:36:39.427 に答える