2014-10-15 10 views
5

Java çağıran kodu:Okuma Nashorn JO4 ve 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}; } 

Hedef: Her Harita değer için

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 

, denedim ve başarısız oldu ettik:

    JO4/NativeArray yöntemleri doğrudan
  • ScriptUtils.wrap() Erişme
  • Harita veya Liste için Döküm ScriptObject veya ScriptObjectMirror
  • için Döküm
  • /ScriptUtils.unwrap()

Ben geçersiz kılma denedim HashMap.put() yöntem, ancak yalnızca açık fonksiyonu üzerine, ödevlerini ScriptObjectMirror dönüştürülebilir bağımsız gözükmektedir çağırır:

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

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

Gerçekten de myCustomHashMap'i kullanmam gerekiyor (zaman damgalarını değiştiriyor ve bir değişiklik listesi vb.), Dolayısıyla bu düzenlemeyi kökten değiştiremiyorum. Bu verileri geri almak için ne yapabilirim?

cevap

1

Bu bir hatadır. Hatta Nesne tipi parametreleri içeren ya da bir nesne [] elemanına tahsis - komut Java nesneleri tabakasına geçirilir her jdk8u40 ile

itibaren, komut nesneleri ScriptObjectMirror dönüştürülür. Yürütme, komut dosyası sınırına geçtiğinde böyle sarılmış yansıtma örnekleri otomatik olarak açılır. yani ScriptObjectMirror nesne olur bir Java yöntemi döner Nesne türü değeri demek, o zaman komut dosyası arayan it a ScriptObject örneğini göreceksiniz JDK8u40 Erken Erişim Release ile

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

(ayna otomatik olarak açılmamış olur)

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

Konsolu:

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