Nashorn: Javascript to Java call question

A. Sundararajan sundararajan.athijegannathan at oracle.com
Wed Jun 5 22:06:50 PDT 2013


Just adding to what Jim said:

Nashorn script objects are exposed as objects of 
jdk.nashorn.api.scripting.ScriptObjectMirror to Java.

The above class implements/extends these:

* javax.script.Bindings

    -- which extends java.util.Map and makes keys to be Strings. This 
lets you view script objects to be Map-like objects

* jdk.nashorn.api.scripting.JSObject

    -- which has set/getMember (for named  properties), set/getSlot (for 
indexed properties), call to make "method"/"function" call on the object

Nashorn repo has 
test/src/jdk/nashorn/api/scripting/ScriptEngineTest.java - this 
exercises features of nashorn's javax.script implementation. This can 
serve as sample code for you.

hope this helps,
-Sundar

On Thursday 06 June 2013 01:21 AM, Jim Laskey (Oracle) wrote:
> The repo you provided has empty JSON-java and JSON-js directories, so I'll give you an alternative example.  The main thing to note is that, because of a JS object's dynamic nature, it can not mirror a Java object.  A better analogy would be to think of a JS object as a Map object, where properties are keys and you access values with keys.
>
> Run the enclosed example as follows;
>
> 	javac Example.java
> 	java Example
>
> The class of myObject is a JSObject.  You can access properties of a JSObject with getMember/setMember (or getSlot/setSlot for integer keys.)
>
> === Example.java ===
>
> import javax.script.*;
> import jdk.nashorn.api.scripting.JSObject;
>
> public class Example {
> 	public static void main(String[] args) throws Exception {
> 		ScriptEngineManager factory = new ScriptEngineManager();
> 		ScriptEngine engine = factory.getEngineByName("nashorn");
> 		engine.eval(new java.io.FileReader("Example1.js"));
> 		JSObject myObject = (JSObject)engine.get("myObject");
> 		System.out.println(myObject.getMember("a"));
> 		System.out.println(myObject.getMember("b"));
> 		System.out.println(myObject.getMember("c"));
>         		myObject.setMember("d", "A new string");
> 		engine.eval(new java.io.FileReader("Example2.js"));
>
> 	}
> }
>
> === Example1.js ===
>
> var myObject = {
>     a: "A string",
>     b: 100,
>     c: true
> }
>
> === Example2.js ===
>
> print(myObject.d);
>
> ==== Output ===
>
> A string
> 100
> true
> A new string
>
>
> Cheers,
>
> -- Jim
>
>
>
>
>
> On 2013-06-05, at 3:50 PM, Mani Sarkar <sadhak001 at gmail.com> wrote:
>
>> Hi,
>>
>> I have another query regarding the example (see
>> https://github.com/neomatrix369/NashornHackDay/blob/master/examples/JSON_in_JS_and_Java/JSJSONInJava.java)
>> created sometime back  during the Nashorn hackday. When I bring a JS object
>> created in Nashorn into Java I'm not able to access the object directly,
>> how do I access it like a normal java object.
>>
>> If its a raw / primitive type then the contents are accessible (you can see
>> the value) while for JS object, when I say
>>
>> *System.out.println(JSObjectFromNashorn);*
>>
>> I get the below output
>>
>> *[object object]*
>>
>> The full implementation of what I'm talking about can be found at the above
>> link.
>>
>> Regards,
>> mani
>>
>> -- 
>> *Twitter:* @theNeomatrix369          *Blog:*
>> http://neomatrix369.wordpress.com
>> *JUG activity:* LJC Advocate (@adoptopenjdk & @adoptajsr programs)
>> *Meet-a-Project:* https://github.com/MutabilityDetector
>> *Bitbucket:* https://bitbucket.org/neomatrix369  * **Github:* https://github
>> .com/neomatrix369
>> *LinkedIn:* http://uk.linkedin.com/pub/mani-sarkar/71/a77/39b
>> *Devoxx UK 2013* was a grand success:
>> http://www.devoxx.com/display/UK13/Home
>>
>> *Don't chase success, rather aim for "Excellence", and success will come
>> chasing after you!*



More information about the nashorn-dev mailing list