2014-10-15 7 views
5

जावा बुला कोड:पढ़ना 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"); 

जावास्क्रिप्ट:

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 में बदल रही हैं जब भी स्क्रिप्ट वस्तुओं जावा परत को पारित कर रहे हैं - यहां तक ​​कि ऑब्जेक्ट प्रकार पैरामीटर के साथ या एक वस्तु [] तत्व को सौंपा। निष्पादन स्क्रिप्ट सीमा तक पार होने पर इस तरह के लपेटे दर्पण के उदाहरण स्वचालित रूप से अनचाहे होते हैं। यानी, एक जावा विधि रिटर्न वस्तु प्रकार मान जो ScriptObjectMirror वस्तु होने वाला कहते हैं, तो स्क्रिप्ट फोन करने वाले यह एक ScriptObject उदाहरण देखेंगे (दर्पण स्वचालित रूप से unwrapped हो जाता है)

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

साथ JDK8u40 शुरुआती एक्सेस रिलीज

जावा:

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); 
    } 
} 

जावास्क्रिप्ट:

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 
संबंधित मुद्दे