2014-10-15 6 views
5

Java Telefonvorwahl:Lesen Nashorn JO4 und 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}; } 

Ziel:

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 

Für jede Karte Wert habe ich versucht und sind gescheitert mit:

  • zu Script oder ScriptObjectMirror Casting
  • Casting auf Karte oder Liste
  • Zugriff JO4/NativeArray Methoden direkt
  • ScriptUtils.wrap()/ScriptUtils.unwrap()

Ich habe überschreiben versucht, die HashMap.put() Methode, aber es scheint nicht zu einem ScriptObjectMirror auf Zuweisungen umgewandelt wird, nur auf explizite Funktion aufruft:

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

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

Ich brauche wirklich myCustomHashMap (es Zeitstempel ändert und verwaltet eine Änderungsliste, etc), so dass ich diese Anordnung nicht radikal ändern kann. Was kann ich tun, um diese Daten wieder zu erhalten?

Antwort

1

Dies ist ein Fehler.

Ab jdk8u40 werden Skriptobjekte in ScriptObjectMirror konvertiert, wenn Skriptobjekte an die Java-Ebene übergeben werden - sogar mit Objekttyp-Parametern oder einem Objekt [] zugewiesen. Solche Wrapped-Mirror-Instanzen werden automatisch ausgepackt, wenn die Ausführung die Skriptgrenze überschreitet. dh sagen eine Java-Methode gibt Typ Wert Objekt, das ScriptObjectMirror Objekt sein geschieht, dann wird Skript Anrufer sehen sie eine Script Instanz

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

Mit JDK8u40 Early Access Mitteilung (Spiegel automatisch ausgepackt wird)

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

Console:

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