13

いくつかのメソッドを持つ単純な Java クラスがあります。

public class Utils {
    public void deal(String price, int amount) {
        // ....
    }
    public void bid(String price, int amount) {
        // ....
    }
    public void offer(String price, int amount) {
        // ....
    }
}

このクラスのインスタンスを作成し、Javascript コードがメソッドを直接呼び出せるようにしたいと思います。

deal("1.3736", 100000);
bid("1.3735", 500000);

今のところ理解できる唯一の方法は、使用することでした

ScriptEngine engine = new ScriptEngineManager().getEngineByName("js");
engine.put("utils", new Utils());

そしてutils.deal(...)Javascriptコードで使用します。メソッドごとに Javascript でラッパー関数を記述することもできますが、クラスのすべてのパブリック メソッドに対してこれを自動的に行う簡単な方法があるはずです。

4

4 に答える 4

7

私はRhinoに精通していませんが、次のようなものがうまくいくはずです:

for(var fn in utils) {
  if(typeof utils[fn] === 'function') {
    this[fn] = (function() {
      var method = utils[fn];
      return function() {
         return method.apply(utils,arguments);
      };
    })();
  }
}

のプロパティをループするだけでutils、関数である各プロパティに対して、それを呼び出すグローバル関数を作成します。

編集:Groovyスクリプトでこれを機能させましたが、コードのようにエンジンではなく、バインディングにutilsを設定する必要がありました:

import javax.script.*

class Utils {
   void foo(String bar) {
      println bar
   }   
}

ScriptEngine engine = new ScriptEngineManager().getEngineByName("js");

engine.eval("""
for(var fn in utils) {
  if(typeof utils[fn] === 'function') {
    this[fn] = (function() {
      var method = utils[fn];
      return function() {
         return method.apply(utils,arguments);
      };
    })();
  }
}

foo('foo'); // prints foo, sure enough
""",new SimpleBindings("utils":new Utils()))
于 2010-03-31T15:03:17.113 に答える
4

JSR-223 API を使用してこれがどのように機能するかはわかりませんが、Rhino API を使用するFunctionObjectと、このように追加したいメソッドで を作成できます。

Class[] parameters = new Class[] { String.class, Integer.class };
Method dealMethod = Utils.class.getMethod("deal", parameters);
engine.put("deal", new FunctionObject("deal", dealMethod, scope));

ドキュメントはhttps://www.mozilla.org/rhino/apidocs/org/mozilla/javascript/FunctionObject.htmlで入手できます。

クラスにアクセスするには Rhino ライブラリを参照する必要があるかもしれませんが、JSR-223 API を使用してオブジェクトをFunctionObject取得する方法はわかりません(ただし、動作する可能性はあります)。scopenull

于 2010-03-31T14:56:16.593 に答える
0

これは、 https ://stackoverflow.com/a/16479685/1089998 の回答で説明されているように、ScriptEngine API ではなく rhino API を使用する場合に可能です。

各実行の前にランダムな JavaScript コードを実行する必要がないことを意味するため、ノアの回答よりもこのアプローチを好みます。

ここに実際の例があります:

https://github.com/plasma147/rhino-play

于 2013-10-05T11:11:06.500 に答える