문제

나는 다음과 같습니다.

ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine jsEngine = mgr.getEngineByName("JavaScript");
jsEngine.eval("function getArray() {return [1,2,3,4,5];};");
Object result = jsEngine.eval("getArray();");

sun.org.mozilla.javaScript.internal.nativearray 유형의 결과 객체를 해당 Java 어레이로 변환하려면 어떻게해야합니까? Somone이 나에게 보여줄 수 있습니까? 작업 코드 샘플 이것이 어디에서 끝났습니까? 문자열 및 정수 배열에 대해 작동해야합니다. 또한 Rhino 엔진과 Java 사이의 다른 데이터 유형 변환을 어디에서 찾아야하는지 아는 것이 좋습니다.

btw, 나는이 페이지를 알고있다 그러나 나는 실제로 작동 코드 샘플을 찾고 있습니다.

도움이 되었습니까?

해결책

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);
}

다른 팁

이 질문이 처음으로 물었을 때의 경우인지 확실하지 않지만 NativeArray 상행 java.util.List 상호 작용. 따라서 실제 Java 배열로 변환하는 간단한 방법은 다음과 같습니다.

Object[] array = ((List<?>) result).toArray();

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;

JavaScript를 변경할 수 없다면이 접근법은 작동하지 않으며 [i] [/i]는 sun.org.mozilla.javaScript.internal.nativeArray 인스턴스가 있습니다. result 변하기 쉬운. 어느 시점에서 나는 당신이 노출하는 공개 방법을 사용하여 직접 캐스트하고 다루어야한다고 생각합니다. 아마 예쁘지는 않지만 다른 옵션은 보이지 않습니다. 특히 좋은 코뿔소 수준에서 보장 할 수있는 유일한 것은 그것이 인스턴스가 될 것입니다. Scriptable (아마도 ScriptableObject), 배열로 사용하는 데 도움이되지 않습니다.

케빈의 대답 여기에가는 좋은 방법 인 것 같습니다 (그리고 내가 방금 편집하려는 것과 비슷합니다! :-))

Jason을 데이터 중간으로 사용하는 일반적인 솔루션 :

Object result = jsEngine.eval("JSON.stringify(getArray())");    
JsonReader jsonReader = Json.createReader(new StringReader(result.toString()));
JsonArray jsonArray = jsonReader.readArray();
jsonReader.close();
int[] numbers = new int[jsonArray.size()];
int index = 0;
for(JsonValue value : jsonArray){
    numbers[index++] = Integer.parseInt(value.toString());
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top