Google Web Toolkit
Search Google Code:

# Accessing Java Methods and Fields from JavaScript

It can be very useful to manipulate Java objects from within the JavaScript implementation of a JSNI method. There is a special syntax for this.

## Invoking Java methods from JavaScript

Calling Java methods from JavaScript is somewhat similar to calling Java methods from C code in JNI. In particular, JSNI borrows the JNI mangled method signature approach to distinguish among overloaded methods.

JavaScript calls into Java methods are of the form

    [instance-expr.]@class-name::method-name(param-signature)(arguments)

where

[instance-expr.]
  must be present when calling an instance method and must be absent when calling a static method
class-name
  is the fully-qualified name of the class in which the method is declared (or a subclass thereof)
param-signature
  is the internal Java method signature as specified here but without the trailing signature of the method return type since it isn't needed to choose the overload
arguments
  the actual argument list to pass to the called method

## Accessing Java fields from JavaScript

Static and instance fields can be accessed from handwritten JavaScript. Field references are of the form

    [instance-expr.]@class-name::field-name

## Example

    public class JSNIExample {

      String myInstanceField;
      static int myStaticField;

      void instanceFoo(String s) {
        // use s
      }

      static void staticFoo(String s) {
        // use s
      }

      public native void bar(JSNIExample x, String s) /*-{
        // Call instance method instanceFoo() on this
        this.@com.google.gwt.examples.JSNIExample::instanceFoo(Ljava/lang/String;)(s);

        // Call instance method instanceFoo() on x
        x.@com.google.gwt.examples.JSNIExample::instanceFoo(Ljava/lang/String;)(s);

        // Call static method staticFoo()
        @com.google.gwt.examples.JSNIExample::staticFoo(Ljava/lang/String;)(s);

        // Read instance field on this
        var val = this.@com.google.gwt.examples.JSNIExample::myInstanceField;

        // Write instance field on x
        x.@com.google.gwt.examples.JSNIExample::myInstanceField = val + " and stuff";

        // Read static field (no qualifier)
        @com.google.gwt.examples.JSNIExample::myStaticField = val + " and stuff";
      }-*/;

    }

Tip
When writing JSNI code, it's helpful to occasionally run in web mode. The JavaScript compiler checks your JSNI code and can flag errors at compile time that you wouldn't catch until runtime in hosted mode.