java Rhino 引用错误
java Nashorn ReferenceError
我正在使用 nashorn 进行一些体验。
为此,我在 java 中编写了这个简单的代码,我想在其中使用我定义的自定义对象。
ScriptEngine engine = new
ScriptEngineManager().getEngineByName("javascript");
System.out.println("engine = " + engine.getClass().getName().toString());
engine.put("id", "2");
System.out.println("id = " + engine.eval("id"));
Object person = engine.eval("importClass(Data.com.personal.Person)");
我returns出现以下错误:
Exception in thread "main" javax.script.ScriptException: ReferenceError: "importClass" is not defined in <eval> at line number 1
现在我 google 它和他们说使用:
load("nashorn:mozilla_compat.js");
但我有点搞不清楚我把这个加载函数放在哪里(或如何使用)?
更新
要导入 class 与 nashorn 一起工作,必须像这样进行调用:
engine.eval("importClass(com.personal.Person)");
出于某种原因,这对我来说并不明显 :P
使用 Nashorn,你应该使用:
var MyJavaClass = Java.type('my.package.MyJavaClass');
现在您可以使用自定义 Java Class。
查看这个很好的介绍以获取更多信息:http://winterbe.com/posts/2014/04/05/java8-nashorn-tutorial/
完整示例:
public final class NashornTest {
// Class can even be inner class. Must be public however!
public static class MyData {
private int id;
private String name;
public MyData(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return String.format("MyData[%d, %s]", id, name);
}
}
@Test
public void test() throws ScriptException {
final ScriptEngineManager sem = new ScriptEngineManager();
final ScriptEngine se = sem.getEngineByName("javascript");
Object obj = se.eval(
"var MyJavaData = Java.type('test.el.NashornTest$MyData');" +
"new MyJavaData(42, 'The usual number');");
// prints MyData[42, The usual number]
System.out.println(obj);
}
}
您应该将 load("nashorn:mozilla_compat.js");
放入您的 java 脚本文件中,或者您可以将这一行 engine.eval("load(\"nashorn:mozilla_compat.js\");");
放入您的 java 代码中。
我正在使用 nashorn 进行一些体验。
为此,我在 java 中编写了这个简单的代码,我想在其中使用我定义的自定义对象。
ScriptEngine engine = new
ScriptEngineManager().getEngineByName("javascript");
System.out.println("engine = " + engine.getClass().getName().toString());
engine.put("id", "2");
System.out.println("id = " + engine.eval("id"));
Object person = engine.eval("importClass(Data.com.personal.Person)");
我returns出现以下错误:
Exception in thread "main" javax.script.ScriptException: ReferenceError: "importClass" is not defined in <eval> at line number 1
现在我 google 它和他们说使用:
load("nashorn:mozilla_compat.js");
但我有点搞不清楚我把这个加载函数放在哪里(或如何使用)?
更新
要导入 class 与 nashorn 一起工作,必须像这样进行调用:
engine.eval("importClass(com.personal.Person)");
出于某种原因,这对我来说并不明显 :P
使用 Nashorn,你应该使用:
var MyJavaClass = Java.type('my.package.MyJavaClass');
现在您可以使用自定义 Java Class。
查看这个很好的介绍以获取更多信息:http://winterbe.com/posts/2014/04/05/java8-nashorn-tutorial/
完整示例:
public final class NashornTest {
// Class can even be inner class. Must be public however!
public static class MyData {
private int id;
private String name;
public MyData(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return String.format("MyData[%d, %s]", id, name);
}
}
@Test
public void test() throws ScriptException {
final ScriptEngineManager sem = new ScriptEngineManager();
final ScriptEngine se = sem.getEngineByName("javascript");
Object obj = se.eval(
"var MyJavaData = Java.type('test.el.NashornTest$MyData');" +
"new MyJavaData(42, 'The usual number');");
// prints MyData[42, The usual number]
System.out.println(obj);
}
}
您应该将 load("nashorn:mozilla_compat.js");
放入您的 java 脚本文件中,或者您可以将这一行 engine.eval("load(\"nashorn:mozilla_compat.js\");");
放入您的 java 代码中。