Nashorn: Javascript to Java call question
A. Sundararajan
sundararajan.athijegannathan at oracle.com
Thu Jun 6 05:03:32 PDT 2013
Previously, nashorn.jar used to have netscape.javascript.JSObject and
ScriptObjectMirror used to extend that class.
To avoid confusion with desktop profile's netscape.javascript.JSObject
(and also avoid applet dependency on nashorn), we have renamed that
class to jdk.nashorn.api.scripting.JSObject.
Chances are that you may be using a jdk8 build with the old version of
nashorn.jar in it. The following should work if you pull and build
nashorn.jar
Say, $jdk/nashorn/dist/nashorn.jar is the latest nashorn.jar built from
nashorn repo
Then the following command can be used:
jjs -J-Djava.ext.dirs=$jdk/nashorn/dist
The above command forces nashorn.jar from your nashorn repo to be
instead of the one bundled in jdk8. Note that this problem will go away
in a future jdk8 snapshot build (as well as fcs release of jdk8)
hope this helps,
-Sundar
On Thursday 06 June 2013 03:55 PM, Mani Sarkar wrote:
> Hi Jim,
>
> You have been very quick with your response to my query.
>
> Thanks for going through the trouble, apologies for the empty folders, they
> are submodules that haven;t been pushed correctly to my repo.
>
> I have made the changes you suggested and rebuilt my class (I had to get
> the latest version of the codebase as JSObject wasn;t present in
> nashorn.jar in my old code-base).
>
> After building and running I get the below:
>
> Exception in thread "main" java.lang.ClassCastException:
> jdk.nashorn.api.scripting.ScriptObjectMirror cannot be cast to
> jdk.nashorn.api.scripting.JSObject
> at JSJSONInJava.main(JSJSONInJava.java:19)
>
> Lines 18 and 19 are as follows:
> 17: // fetch the value of a variable
> 18: Object objFromJS = engine.get("JSONObjectUsingJavaScript");
> 19: JSObject jsonObjFromJS = (JSObject) objFromJS;
>
> Any ideas, or is it something new?
>
> Regards,
> mani
>
> On Wed, Jun 5, 2013 at 8:51 PM, Jim Laskey <james.laskey at oracle.com> 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