2014-10-15 16 views
5

Java kod wywołujący:Reading Nashorn JO4 i 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}; } 

Cel:

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 

Dla każdej wartości Mapa, próbowałem i nie udało się:

  • Casting do ScriptObject lub ScriptObjectMirror
  • Casting do mapy lub listy
  • Dostęp do metod JO4/NativeArray bezpośrednio
  • ScriptUtils.wrap()/ScriptUtils.unwrap()

Próbowałem nadrzędnymi HashMap.put() metoda, ale wydaje się nie być konwertowane do ScriptObjectMirror nad zadaniami, tylko na wyraźne wywołania funkcji:

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

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

Naprawdę potrzebuję użyć myCustomHashMap (to znaczniki czasu zmieniają i zachowują listę zmian, itd.), Więc nie mogę radykalnie zmienić tej aranżacji. Co mogę zrobić, aby odzyskać te dane?

Odpowiedz

1

To jest błąd.

z jdk8u40 r obiekty Script są przekształcane ScriptObjectMirror gdy przedmioty Script są przekazywane do warstwy Java - nawet typ obiektu parametrów lub przyporządkowana do [] elementu obiektu. Takie owinięte instancje lustrzane są automatycznie rozpakowywane, gdy wykonywanie przechodzi do granicy skryptu. czyli, powiedzmy Java metoda zwraca obiekt wartości typu, który dzieje się obiekt ScriptObjectMirror, następnie skrypt rozmówca będzie go zobaczyć instancji ScriptObject (lustro dostaje odwinął automatycznie)

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

Z JDK8u40 wczesnego zwalniania

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]; 

konsoli:

Key: object Value: [object Object] Class: class jdk.nashorn.api.scripting.ScriptObjectMirror 
Key: array Value: [object Array] Class: class jdk.nashorn.api.scripting.ScriptObjectMirror