4

がオブジェクトの属性である場合、jsr-223 が文字列を評価しないのはなぜですか?

String 属性が 1 つだけの単純なクラス:

public class EvalJSR223Bean {
    public String evalFnt;
}

テキストとオブジェクトを使用した単純な評価であり、オブジェクトを使用する場合、Rhino は eval を実行しません。しかし、空の JavaScript 文字列をオブジェクト プロパティに連結すると、Rhino eval.

public static void main(String[] args) throws ScriptException {
    ScriptEngineManager manager = new ScriptEngineManager();
    ScriptEngine engine = manager.getEngineByName("JavaScript");


    engine.eval("function f2() {println('EXECUTED!!!!!')}; function f1(source) {  return eval(source); };");


    String evalFnt = "(function(){f2();return '0';})();";
    engine.put("evalFnt", evalFnt);
    engine.eval("f1(evalFnt);"); // f2 is executed.


    EvalJSR223Bean bean = new EvalJSR223Bean();
    bean.evalFnt = evalFnt;


    engine.put("bean1", bean.evalFnt);
    engine.eval("f1(bean1.evalFnt);"); // Why does NOT executed f2 ?!!.

    engine.put("bean", bean);
    engine.eval("f1(bean.evalFnt);"); // Why does NOT executed f2 ?!!.

    engine.put("bean", bean);
    engine.eval("f1( ''+bean.evalFnt );"); // And if I concatenate a string, f2 is executed!!!
}
4

1 に答える 1

2

eval文字列のタイプが「string」でない場合、文字列を無視します。

eval(new String('console.log("foo");'));

したがって、これは、Rhinoがプロパティを「オブジェクト」型として処理する方法の結果である可能性があります。文字列をエンジンに取り込むときはput、それを値型に変換する必要があります。

このコード:

import javax.script.*;

public class ScriptDemo {
  public static class Bar {
    public String bar = "bar";
  }

  public static void main(String[] args) throws ScriptException {
    ScriptEngine engine =
                         new ScriptEngineManager().getEngineByName("JavaScript");
    engine.put("foo", "foo");
    engine.put("bar", new Bar());
    engine.eval("println(typeof foo);");
    engine.eval("println(typeof bar.bar);");
    engine.eval("println(typeof String(bar.bar));");
    engine.eval("println(typeof new String(bar.bar));");
  }
}

出力:

string
object
string
object
于 2013-01-17T16:08:18.157 に答える