Skip to main content

A JDK6 JavaScript Console Conundrum

Posted by cayhorstmann on January 3, 2007 at 10:18 PM PST

I haven't blogged for a while, but I have plausible deniability. We
just got twins.

???

Today, I discovered the JavaScript console in JDK6. From a command
shell, run jrunscript (assuming, of course, that you have
$JAVA_HOME/bin on your path). You get a JavaScript interpreter
that lets you script Java classes. For example, try this little
program:

importPackage(Packages.javax.swing);
frame = new JFrame();
label = new JLabel("Hello, World");
frame.add(label);
frame.setSize(200, 100);
frame.setVisible(true);

You get a GUI "Hello, World" program. Pretty nifty--no fussing with
type declarations or the dreaded public static void main.

???

It works even better inside Emacs, with shell mode.

???

I am not smart enough to get regular expressions right on the first
try, and I usually write a trivial Java program, complete with public
static void main
, to test them out before plugging them into a bigger
program. When I discovered the JavaScript console, I figured that I no
longer had to do that. Just fire up jrunscript and try it
out:

js> Arrays.toString("foo bar".split(" "));
script error: sun.org.mozilla.javascript.internal.EvaluatorException: The choice of Java constructor toString matching JavaScript argument types (object) is ambiguous; candidate constructors are:
    class java.lang.String toString(long[])
    class java.lang.String toString(int[])
    class java.lang.String toString(short[])
    class java.lang.String toString(char[])
    class java.lang.String toString(byte[])
    class java.lang.String toString(boolean[])
    class java.lang.String toString(float[])
    class java.lang.String toString(double[])
    class java.lang.String toString(java.lang.Object[]) (<STDIN>#1) in <STDIN> at line number 1

Ok, whatever.

js> Arrays.asList("foo bar".split(" "));
[foo, bar]

Good--that worked. What about arbitrary white space:

js> Arrays.asList("foo bar".split("\\s+"));
[foo bar]

WTH? Why didn't it split? Do I need one backslash? Four backslashes?

js> Arrays.asList("foo bar".split("\s+"));
[foo bar]
js> Arrays.asList("foo bar".split("\\\\s+"));
[foo bar]

Arggh. Back to good old public static void main:

import java.util.*;
public class Test {
   public static void main(String[] args) throws Exception {
      System.out.println(Arrays.asList("foo bar".split("\\s+")));
   }
}

The output is, of course,

[foo, bar]

Why doesn't this work in JavaScript? Perhaps JavaScript's strings
aren't the same as Java String objects? Finally, I tried

js> Arrays.asList(new java.lang.String("foo bar").split("\\s+"));
[foo, bar]

Sweet success. But I am not sure I understand what is going on.

I often hear about the productivity gains of scripting languages, but I
am not left with the warm and fuzzy feeling that the JavaScript console
will save me time in the future.

Related Topics >>