关于 Nashorn - JSObject 的问题
Questions about Nashorn - JSObject
我想创建一个 JSObject 并用属性填充它(有点像 HashMap),但不转换 eval("({})") 的结果,因为我认为不断评估这样一个事情真的会对性能产生影响。有办法吗?
如果您想使用像地图这样的脚本对象,您不妨使用来自 Nashorn 脚本的 java.util.HashMap 个实例!除了支持通常的 java 方法调用外,Nashorn 的链接器特例 java.util.Map 实例并支持 keys-as-属性 names idiom。这比使用 Javascript 对象作为 Map 更有效。
$ jjs
jjs> var m = new java.util.HashMap
jjs> m.foo = "bar"
bar
jjs> m.foo
bar
jjs> m.get("foo")
bar
jjs> m.put("js", "nashorn")
null
jjs> m.js
nashorn
但是,如果您坚持使用 JS-object-as-map,那么您可以执行 eval 并转换为您提到的 JSObject。您可能想要测量性能。在进行任何进一步更改之前点击(假设!)!
您还可以获取 JS "Object" 构造函数对象和 'cache' 它用于从 Java 代码重复创建对象。然后,您可以对其调用 newObject() 方法来创建一个新的空对象。
import javax.script.*;
import jdk.nashorn.api.scripting.JSObject;
public class Main {
public static void main(String[] args) throws Exception {
ScriptEngineManager m = new ScriptEngineManager();
ScriptEngine e = m.getEngineByName("nashorn");
// get JS "Object" constructor object
JSObject objConstructor = (JSObject)e.eval("Object");
// call 'newObject' on Object constructor
JSObject jsObj = (JSObject) objConstructor.newObject();
// fill properties of the new empty script object
jsObj.setMember("foo", "bar");
// expose the new JS object as global var!
e.put("obj", jsObj);
// print the object as a JSON string
e.eval("print(JSON.stringify(obj))");
}
}
请注意,上述方案也适用于任何用户定义的构造函数。例如。如果你想使用特定的用户定义的构造函数创建对象,你只需要替换
JSObject objConstructor = (JSObject)e.eval("Object");
和
JSObject objConstructor = (JSObject)e.eval("MyConstructorFunc");
(假设您已经评估过代码以定义 MyConstructorFunc 函数)。
其余代码同上
我想创建一个 JSObject 并用属性填充它(有点像 HashMap),但不转换 eval("({})") 的结果,因为我认为不断评估这样一个事情真的会对性能产生影响。有办法吗?
如果您想使用像地图这样的脚本对象,您不妨使用来自 Nashorn 脚本的 java.util.HashMap 个实例!除了支持通常的 java 方法调用外,Nashorn 的链接器特例 java.util.Map 实例并支持 keys-as-属性 names idiom。这比使用 Javascript 对象作为 Map 更有效。
$ jjs
jjs> var m = new java.util.HashMap
jjs> m.foo = "bar"
bar
jjs> m.foo
bar
jjs> m.get("foo")
bar
jjs> m.put("js", "nashorn")
null
jjs> m.js
nashorn
但是,如果您坚持使用 JS-object-as-map,那么您可以执行 eval 并转换为您提到的 JSObject。您可能想要测量性能。在进行任何进一步更改之前点击(假设!)!
您还可以获取 JS "Object" 构造函数对象和 'cache' 它用于从 Java 代码重复创建对象。然后,您可以对其调用 newObject() 方法来创建一个新的空对象。
import javax.script.*;
import jdk.nashorn.api.scripting.JSObject;
public class Main {
public static void main(String[] args) throws Exception {
ScriptEngineManager m = new ScriptEngineManager();
ScriptEngine e = m.getEngineByName("nashorn");
// get JS "Object" constructor object
JSObject objConstructor = (JSObject)e.eval("Object");
// call 'newObject' on Object constructor
JSObject jsObj = (JSObject) objConstructor.newObject();
// fill properties of the new empty script object
jsObj.setMember("foo", "bar");
// expose the new JS object as global var!
e.put("obj", jsObj);
// print the object as a JSON string
e.eval("print(JSON.stringify(obj))");
}
}
请注意,上述方案也适用于任何用户定义的构造函数。例如。如果你想使用特定的用户定义的构造函数创建对象,你只需要替换
JSObject objConstructor = (JSObject)e.eval("Object");
和
JSObject objConstructor = (JSObject)e.eval("MyConstructorFunc");
(假设您已经评估过代码以定义 MyConstructorFunc 函数)。 其余代码同上