كيفية تحويل وحيد القرن-صفائف جافا سكريبت جافا-المصفوفات

StackOverflow https://stackoverflow.com/questions/1433382

  •  07-07-2019
  •  | 
  •  

سؤال

لدي التالية:

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

كيف يمكنني تحويل نتيجة لذلك الكائن الذي هو من نوع الشمس.org.موزيلا.جافا سكريبت.الداخلية.NativeArray إلى المقابلة جافا مجموعة ؟ يمكن somone تظهر لي العمل نموذج التعليمات البرمجية حيث يتم ذلك ؟ يجب أن تعمل String و Integer المصفوفات.بالإضافة إلى أنه سيكون أمرا رائعا أن أعرف من أين للبحث عن نوع بيانات آخر التحويلات بين وحيد القرن محرك جافا.

راجع للشغل ، أنا أعرف هذه الصفحة ولكن أنا حقا تبحث عن عمل نموذج التعليمات البرمجية.

هل كانت مفيدة؟

المحلول

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 واجهة.طريقة بسيطة لتحويل الحقيقي جافا مجموعة بالتالي:

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

إذا كان جافا سكريبت هي تحت التحكم الخاصة بك, يمكنك القيام التحول هناك ، كما في هذه الوثيقة.لذا على التكيف مع المثال الخاص بك, شيء من هذا القبيل:

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;

على الرغم من أن, إذا كنت لا تستطيع تغيير جافا سكريبت هذا النهج لن ينجح, و كنت [أنا]سوف[/i] لها مثيل من الشمس.org.موزيلا.جافا سكريبت.الداخلية.NativeArray الخاص بك result متغير.عند هذه النقطة أعتقد أنك في حاجة فقط إلى المدلى بها و التعامل معها مباشرة ، باستخدام أي العام وطرق الكشف;انها ربما ليست جميلة ولكن أنا لا أرى أي خيارات أخرى.ولا سيما أعتقد أن الشيء الوحيد الذي يمكن أن يضمن في جميل وحيد القرن المستوى هو أنه سيكون مثيل Scriptable (وربما ScriptableObject) التي لا تساعدك على استخدامه كما صفيف.

كيفن الجواب يبدو وكأنه وسيلة جيدة للذهاب هنا (و هو على غرار ما كنت على وشك تحرير في!:-))

عامة الحل باستخدام جيسون البيانات الوسيطة:

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