簡體   English   中英

為什么Rhino(jsr-223)是對象的屬性時不評估字符串?

[英]Why does not Rhino (jsr-223) evaluate a string when it is an attribute of an object?

為什么當對象的屬性是jsr-223時不評估字符串?

僅具有一個String屬性的簡單類:

public class EvalJSR223Bean {
    public String evalFnt;
}

使用文本和對象進行簡單評估,使用該對象時,Rhino不執行評估。 但是,如果我將空的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!!!
}

如果字符串不是“ string”類型,則eval忽略該字符串:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM