2

このプロジェクトでは、Rhino で javax.scripting を利用しています。

Java オブジェクト (Double、Long、Integer など) を返す Java メソッドがあります。そのメソッドを JavaScript から呼び出し、その結果を Javascript プリミティブ型として参照したいと考えています。ただし、javacript は戻り値の型を Object として認識します。

javascriptプリミティブに強制的に変換するにはどうすればよいですか?

この質問はhttp://groups.google.com/group/mozilla.dev.tech.js-engine.rhino/browse_thread/thread/2f3d43bb49d5288a/dde79e1aa72e1301とよく似てい ます

問題は、コンテキストと WrapFactory への参照を取得する方法です。

サンプルコード:

public class data 
{ 
   Double value = 1.0d; 
   public Number get()  {  return value; } 
} 


  public static void main(String[] args) 
    { 
            ScriptEngine engine = new ScriptEngineManager().getEngineByName ("rhino"); 
            data data = new data(); 
            try 
            { 
                    engine.eval("function test(data) { return data.getD('value1') + 5;};"); 
                    System.out.println("Result:" + ((Invocable)engine).invokeFunction("test", data)); 
            } 
            catch (Exception e) 
            { 
                    e.printStackTrace(); 
            } 
    } 

出力: 結果: 15

4

3 に答える 3

0

私はこのアプリケーションを開発しました。このアプリケーションでは、Java6に組み込まれているJavaScriptエンジンによって評価される数式のセットを入力します。これはrhinoの移植版であると思います。アイデアは、マップのセットがあり、これらのマップには次のような変数が含まれるというものでした。

MAP["VALUE 1"]
MAP["VALUE 2"]

数式の式の一部が私の制御下にあり、無効なJS識別子である可能性がある変数からのものであるため、このアプローチを使用しました。私の最初のアプローチは、マップを宣言してJSエンジンに追加することでしたが、失敗したのと同じように失敗しました。つまり、数値ではなく文字列として解釈していました。

解決策は、数式を解析し、数式で使用されている変数を特定してから、JSエンジン内でオブジェクトを宣言することでした。

このようなもの:

var MAP = new Object();
MAP["VALUE 1"] = 1;
MAP["VALUE 2"] = 2;

そして、ではなく、MAP["VALUE 1"] + MAP["VALUE 2"]を返します。312

より良い解決策があるかもしれませんが、最初のコーディング/解析を回避すると、上記は常に機能します。この場合、「宣言型」ステートメントを実行するフェーズと、数式を実行するフェーズがあります。JSエンジンは非常に高速なので、問題ありません。

于 2009-10-17T05:52:48.387 に答える
0

JavaScript コードの出力として次を使用します。

function aFunction(data)
{
  return parseInt(data);
}
于 2009-10-17T01:50:36.843 に答える