gpt4 book ai didi

java - 为什么 Rhino (jsr-223) 不对作为对象属性的字符串求值?

转载 作者:搜寻专家 更新时间:2023-11-01 03:25:59 24 4
gpt4 key购买 nike

当字符串是对象的属性时,为什么 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!!!
}

最佳答案

eval 如果字符串不是“string”类型则忽略该字符串:

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

所以这可能是 Rhino 如何将属性视为“对象”类型的结果。当您一个字符串放入引擎时,它必须将其转换为值类型。

这段代码:

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

关于java - 为什么 Rhino (jsr-223) 不对作为对象属性的字符串求值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13778107/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com