2014-10-15 5 views
5

Java код вызова:Чтение Nashorn JO4 и NativeArray

import jdk.nashorn.api.scripting.*; 
.... 
myCustomHashMap dataStore = new myCustomHashMap(); 
ScriptEngineManager sem = new ScriptEngineManager(); 
ScriptEngine engine = sem.getEngineByName("nashorn"); 
engine.put("dataStore",dataStore); 
engine.eval(new java.io.FileReader("test.js")); 
((Invocable)engine).invokeFunction("jsTestFunc", "testStr"); 

Javascript:

function jsTestFunc (testParam) 
    { dataStore.a = [1,2,3]; 
    dataStore.b = {First:"John",Last:"Doe",age:37}; } 

Цель:

I need to JSONify the dataStore after the script execution 
with no dependence on the script for assistance 

dataStore.a -> jdk.nashorn.internal.objects.NativeArray 
dataStore.b -> jdk.nashorn.internal.scripts.JO4 

Для каждого значения карт, я попробовал и потерпел неудачу с:

  • Кастинг в ScriptObject или ScriptObjectMirror
  • Кастинг на карте или в списке
  • Доступ к методам JO4/NativeArray непосредственно
  • ScriptUtils.wrap()/ScriptUtils.unwrap()

Я попытался переопределяя HashMap.put() метода, но он, кажется, не быть преобразован в ScriptObjectMirror по заданиям, только на четких вызовы функций:

dataStore.x = [1,2,3] ; -> jdk.nashorn.internal.objects.NativeArray 

javaHost.javaFunc([1,2,3]); -> ScriptObjectMirror 

Мне действительно нужно использовать myCustomHashMap (это временные изменения и поддерживает список изменений и т. Д.), Поэтому я не могу радикально изменить эту схему. Что я могу сделать, чтобы вернуть эти данные?

ответ

1

Это ошибка.

С jdk8u40 и далее объекты скрипта преобразуются в ScriptObjectMirror всякий раз, когда объекты сценария передаются на уровень Java - даже с параметрами типа Object или назначаются элементу Object []. Такие экземпляры завернутого зеркала автоматически распаковываются, когда выполнение пересекает границу сценария. то есть, скажем, метод возвращает значение объекта типа Java, которое случается быть объектом ScriptObjectMirror, то скрипт вызывающий абонент увидит его экземпляр ScriptObject (зеркало получает разворачивал автоматически)

https://wiki.openjdk.java.net/display/Nashorn/Nashorn+jsr223+engine+notes

С JDK8u40 Early Access Release

Java:

public class MyObject extends HashMap<String, Object> { 
    @Override 
    public Object put(String key, Object value) { 
     System.out.println("Key: " + key + " Value: " + value + " Class: " + value.getClass()); 
     return super.put(key, value); 
    } 
} 

JavaScript:

var MyObject = Java.type("my.app.MyObject"); 
var test = new MyObject; 
test.object = {Test : "Object"}; 
test.array = [1,2,3]; 

консоли:

Key: object Value: [object Object] Class: class jdk.nashorn.api.scripting.ScriptObjectMirror 
Key: array Value: [object Array] Class: class jdk.nashorn.api.scripting.ScriptObjectMirror 
Смежные вопросы