我正在使用Java Scripting Engine(在Java 1.6中)动态评估我的Java程序中的一些表达式。我可以将Java对象从Java传递给JavaScript,并调用它们的方法,但是当我传递String对象时,这会停止正常工作。
例如,在我的Java中,我可以使用doSomething方法定义一个类JavaClass。 然后,当我将JavaClass对象传递给JavaSCript时,我可以调用doSomething方法。
但是,如果我在Java中创建一个String对象并将其传递给JavaScript,当我尝试在JavaScript中调用endsWith方法时会出现错误。
我的代码如下: -
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("JavaScript");
String myString = "apple hello";
JavaClass javaClass = new JavaClass();
engine.put("myString", myString);
engine.put("thing", javaClass);
engine.eval("thing.doSomething()");
engine.eval("myString.endsWith(\"hello\")");
正确调用doSomething方法,但找不到endsWith: -
__EXCEPTION__:javax.script.ScriptException: sun.org.mozilla.javascript.internal.EcmaError: TypeError: Cannot find function endsWith.
就好像我的Java String对象被转换为JavaScript字符串对象 - 例如,我可以使用JavaScript String的length属性。
我可以将自己的endsWith函数添加到我的JavaClass类中,该类只调用String endsWith,这样可以正常工作 - 但不是很好...... :(
如果正在转换,我可以阻止这种情况发生吗? 如果这是别的,我做错了吗?有办法解决吗?
谢谢! :)
答案 0 :(得分:1)
将最后一行更改为此。默认情况下,字符串会自动在Java和JS类型之间进行转换。因此,您必须强制将myString
转换为JS代码中的Java字符串..
engine.eval("new java.lang.String(myString).endsWith(\"hello\")");