我尝试使用Rhino将Java字符串传递给JavaScript,并将其识别为" native" JavaScript字符串。
示例:
Java对象:
public class MyTestObject {
public Object returnStringValue() {
return "Hello";
}
}
Rhino设置
import java.io.FileNotFoundException;
import javax.script.*;
public class TestRhino{
public static void main(String[] args) throws FileNotFoundException, ScriptException, NoSuchMethodException {
// Create my Java Object
MyTestObject testObject = new MyTestObject();
// Initiate the JavaScript engine
ScriptEngine engine = new ScriptEngineManager().getEngineByName("javascript");
Compilable compEngine = (Compilable)engine;
// evaluate my JavaScript file; add my Java object to it
engine.eval(new java.io.FileReader("MyJavaScriptFile.js"));
engine.put("testObject", testObject); // this adds my Java Object to Rhino
// Invoke my javaScript function
Invocable inv = (Invocable) engine;
Object returnVal = inv.invokeFunction("testFunction");
// print out the result
System.out.println(returnVal);
}
}
JavaScript函数(此不能被修改)
function testFunction() {
let myString = testObject.returnStringValue();
switch (myString)
{
case "Hello":
return "OK";
}
return "Not OK";
}
当前输出:"不行"。
我认为这是由于Rhino应用严格的开关比较,因为以下内容返回Switch comparison is strict.
。
function testFunction() {
switch(1) {
case '1':
return 'Switch comparison is NOT strict.';
case 1:
return 'Switch comparison is strict.';
}
}
另请注意,以下函数返回true
function testFunction() {
let myString = testObject.returnStringValue();
return myString == "Hello";
}
但是以下函数返回false
function testFunction() {
let myString = testObject.returnStringValue();
return myString === "Hello";
}
我无法修改JavaScript代码,只修改Java代码,因此我正在寻找一种解决方案,通过仅修改Java代码来使switch语句工作。
作为一个注释,这适用于Nashorn(从Java 1.8开始实现的默认JavaScript引擎),但是我必须使用Rhino。