Chr*_*ris 17 java scripting rhino jsr223
我有以下内容:
ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine jsEngine = mgr.getEngineByName("JavaScript");
jsEngine.eval("function getArray() {return [1,2,3,4,5];};");
Object result = jsEngine.eval("getArray();");
Run Code Online (Sandbox Code Playgroud)
如何将sun.org.mozilla.javascript.internal.NativeArray类型的结果对象转换为相应的java数组?可以告诉我一个工作代码示例吗?它应该适用于String和Integer数组.另外,知道在哪里查找rhino引擎和java之间的其他数据类型转换会很棒.
顺便说一句,我知道这个页面,但我真的在寻找一个有效的代码示例.
Kev*_*vin 23
NativeArray arr = (NativeArray) result;
Object [] array = new Object[(int) arr.getLength()];
for (Object o : arr.getIds()) {
int index = (Integer) o;
array[index] = arr.get(index, null);
}
Run Code Online (Sandbox Code Playgroud)
我不确定在第一次提出这个问题时是否就是这种情况,但NativeArray实现了java.util.List界面.因此,转换为真实Java数组的简单方法是:
Object[] array = ((List<?>) result).toArray();
Run Code Online (Sandbox Code Playgroud)
如果Javascript在您的控制之下,您可以根据此文档在那里进行转换.所以为了适应你的例子,比如:
ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine jsEngine = mgr.getEngineByName("JavaScript");
jsEngine.eval("function getArray() {return [1,2,3,4,5];};");
String convertFuncSrc =
"function convertArray(type, arr) {"
+ " var jArr = java.lang.reflect.Array.newInstance(type, arr.length);"
+ " for (var i = 0; i < arr.length; i++) { "
+ " jArr[i] = arr[i];"
+ " }"
+ " return jArr;"
+ "};";
jsEngine.eval(convertFuncSrc);
Object result = jsEngine.eval("convertArray(java.lang.Integer.TYPE, getArray());");
int[] javaArray = (int[])result;
Run Code Online (Sandbox Code Playgroud)
虽然,如果你不能改变Javascript这种方法将不起作用,你[i]将[/ i]有一个sun.org.mozilla.javascript.internal.NativeArray实例作为你的result变量.在这一点上,我认为你只需要使用它暴露的任何公共方法直接投射和处理它; 它可能不漂亮,但我没有看到任何其他选择.特别是我认为你唯一可以保证在Rhino级别上保证它会是Scriptable(并且可能ScriptableObject)的一个实例,它无法帮助你将它用作数组.
凯文的答案看起来像是一个很好的方式去(这和我刚刚编辑的内容类似!:-))
| 归档时间: |
|
| 查看次数: |
23247 次 |
| 最近记录: |