【发布时间】:2011-06-24 07:30:20
【问题描述】:
为了了解如何将 Java 对象绑定到动态语言中的符号,我编写了以下 spike test,将 java.lang.Integer 绑定到要在 JavaScript 中更改的符号 i:
@Test
public void bindToLocalVariable() throws ScriptException {
javax.script.ScriptEngineManager sem
= new javax.script.ScriptEngineManager();
javax.script.ScriptEngine engine
= sem.getEngineByName("JavaScript");
Integer i = new Integer(17);
engine.put( "i", i );
engine.eval( "i++;" ); // Now execute JavaScript
assertEquals( 18, i.intValue() );
}
不幸的是,我失败了。
java.lang.AssertionError: expected:<18> but was:<17>
JavaScript 知道符号 i(否则它会抛出 ScriptException,但情况并非如此),但不会对原始 Integer 对象执行递增操作 i++。
有什么解释吗?
【问题讨论】:
-
使用
engine.get("i")在您评估"i++;"之后 获取引擎中i的值。请记住,您现在有 两个 名为i的东西:Integer应用程序中的本地变量Integer和 JavaScript 引擎中的变量。 -
Joachim,我没有两件事,但我为一件事有两个名字。一份来自 Java,一份来自 JavaScript。
-
@rplantiko:不,那是错误的。你甚至观察到事实并非如此。 没有办法 JavaScript 引擎可以更改
i的值(它也不能更改存储在Integer对象中的值,因为Integer是不可变的)。 -
约希姆。至于整数的不变性,我希望在幕后自动装箱,就像 Java 语句
i++;一样,它也会改变 i 的值。 -
Joachim:但感谢您评论的要点。我不知道JS不是在原件上工作,而是在副本上。
标签: java javascript rhino