二、JavaScript Native Interface
JavaScript本地接口JSNI。
1)声明一个本地方法
在JSNI中声明一个本地方法时,使用Java的标准native关键字,就像在JNI(Java Native Interface)中一样。在JNI中,本地C代码是一个单独的文件,独立编译且在运行时动态加载。
在JSNI中,本地JavaScript代码用一种特殊的注释格式直接嵌入到Java源代码中。
JSNIProject/src/com/xyz/client/Alert.java
--------------------------------------
public class Alert{
  public static native void alert(String msg) /*-{
    $wnd.alert(msg);
    }-*/;
}
--------------------------------------
JSNI注释块以“/*-{”开头,以“}-*/”结束。
这个例子显示,当用JSNI访问浏览器窗口和文档对象时,必须分别用$wnd和$doc引用它们。在嵌套的框架中运行已编译的脚本时,$wnd和$doc会自动的初始化,用主机页窗口和文档来代替框架。
2)它的工作机制
在WEB模式中,GWT编译器把客户端一半的Java程序转换成JavaScript。
正常情况,当编译器看到方法声明时,其括号内部的代码必须经历解释过程。如果方法是本地方法,编译器处理更为简单。它直接复制JavaScript本地代码到已编译的结果中。
一旦JavaScript被解释后,JavaScript代码中的任何错误就只能在运行时才能发现。
3)从Java中调用JSNI
在Java中调用JSNI与调用其它Java方法没有什么不同。
JSNIProject/src/com/xyz/client/LSNIExample.java
--------------------------------------
button1.addClickListener(new ClickListener(){
  public void onClick(Widget sender){
    Alert.alert("Clicked!");
  }
});
--------------------------------------
4)从JSNI中调用Java
假定你传递一个对象到JSNI方法,你需要访问一个字段或在对象中调用一个方法。你还需知道GWT编译器怎样弄糟Java域和方法名,因此你可以在JavaScript代码中访问它们。
(1)访问Java域(field)
访问Java域的语法如下:
--------------------------------------
obj.@class::field
--------------------------------------
obj 是引用对象的实例
class 是具有full-qualified的类
field 访问域的域名
(2)调用Java方法
调用Java方法的语法和访问Java域的语法相似,语法如下:
--------------------------------------
obj.@class::method(sig)(args)
--------------------------------------
method 调用方法的方法名
sig 内部的Java方法签名
args 方法传递的参数列表
(3)方法签名(Method Signature)
JSNI方法签名确切地说和JNI方法签名一样,除了方法返回类型有所不同。
下面的表显示了这些方法签名
--------------------------------------
Type Signature        Java Type
--------------------------------------
Z                     boolean
B                     byte
C                     char
S                     short
I                     int
J                     long
F                     float
D                     double
[type                 type()
Lfully-qualified-class;      fully-qualified-class
--------------------------------------
例如:Java方法:
long f(int n, String s, int[] arr);
有如下的类型签名:
ILjava/lang/String;[I)
(4)例子
下面的代码显示了通过JSNI访问Java域和方法的例子。它说明了传递数字、字符串、布尔型和Java对象到JavaScript。它还显示了JavaScript方法怎样调用传递过来的Java对象。
--------------------------------------
Java类型           它是怎样出现在JavaScript代码中的
a Java numeric primitive    var x=42;
String             var s="my string";
boolean            var b=true;
JavaScriptObject   从JavaScript代码中初始化,典型的是作为其它JSNI方法的返回值
Java Object        通过特殊语法得到的不透明的值
--------------------------------------
JSNIProject/src/com/xyz/client/j2js.java
----------------------------------------------------------
public class J2JS{
  /** Pass a Java numeric primitive */
  public static void testJ2JSNumeric(){
    int x=42;
    jsNumeric(x);
  }
  privae static native void jsNumeric(int x)/*-{
    $wnd.alert("x is "+x);
  }-*/;
  /** Pass a Java String */
  public static void testJ2JSString(){
    String s="my string";
    jsString(s);
  }
  private static native void jsString(String s) /*-{
    $wnd.alert("s is "+s);
  }-*/;
  /** Pass a boolean */
  public static void testJ2JSBoolean(){
    boolean b=true;
    jsBoolean(b);
  }
  private static native void jsBoolean(boolean b) /*-{
    $wnd.alert("b is "+b);
  }-*/;
  /** Pass an arbitrary Java Object */
  public static void testJ2JSObject(){
    MyJavaObject obj=new MyJavaObject();
    jsObject(obj);
  }
  private static native void jsObject(MyJavaObject obj) /*-{
    $wnd.alert("Calling getText():"+obj.@MyJavaObject::getTextAt(I)(3));
  }-*/;
}
----------------------------------------------------------
如果你看GWT的源码时,可以看到许多安装JSNI定义的东东。大多数GWT编程者不需要定义JSNI方法,但还是该留意它,或许用得上

JSNI GWT中的东东的更多相关文章

  1. 在JS中,一切东东其实都是对象

    对象是组成JavaScript的基本单元,在JS中,一切东东其实都是对象,而且功能非常强大,它不仅风格独特,功能也与众不同. 一.引用(reference) 引用的概念是JS的基础之一,它是指向对象实 ...

  2. C++ 中可调用的且有函数功能的东东

    第一个:函数     其实函数在声明的时候都有个名字: 这个名字可以看作是是指针,将其直接赋值给函数指针 也可以看作是可取指的对其& 再赋值给函数指针 第二个:函数指针   通过其被赋值的方式 ...

  3. 长见识了,知道了collected和Graphite 这两个东东

    今天下午的讨论会议中,听到了两个名词collected和Graphite这是神马东东,以前在bingo的时候也没听说过,开完会下去查了下.原来他两是监控系统的啊.以前也从来没做过系统监控方面的项目,这 ...

  4. SQLSERVER 里经常看到的CACHE STORES是神马东东?

    SQLSERVER 里经常看到的CACHE STORES是神马东东? 当我们在SSMS里执行下面的SQL语句清空SQLSERVER的缓存的时候,我们会在SQL ERRORLOG里看到一些信息 DBCC ...

  5. 【UVA 1151】 Buy or Build (有某些特别的东东的最小生成树)

    [题意] 平面上有n个点(1<=N<=1000),你的任务是让所有n个点连通,为此,你可以新建一些边,费用等于两个端点的欧几里得距离的平方. 另外还有q(0<=q<=8)个套餐 ...

  6. gwt中java与js的相互调用

    1. java通过jsni调用内部js Button button = new Button("java调用内部jsni的js方法"); button.addClickHandle ...

  7. GWT中实现跳转及不同entrypoint怎么互相访问

    怎么跳转? 跳转这个概念这里指的是从一个web页面跳转到另一个web页面,如果我们使用gwt来开发web,很自然的我们会想到怎么从一个gwt做的页面跳转到另一个gwt做的页面. 但从网上的gwt例子来 ...

  8. (转)loff_t *ppos是什么东东

    ssize_t generic_file_read(struct file * filp, char * buf, size_t count, loff_t *ppos) 这是一个文件读函数 我们很容 ...

  9. [巩固C#] 一、特性是什么东东

    阅读目录   关闭   前言 特性是什么? 那么什么是“元数据”? 特性到底是什么? 我们自定义一个特性玩玩 什么是命名参数? 我们来继续要看看AttributeUsage(这个描... 自定义特性可 ...

随机推荐

  1. Apache 多站点(虚拟主机)

    普遍 apache多站点(灰色(连接一起的红色)字体 为命令) 编辑文件:httpd.conf 找到以下内容: # Virtual hosts # Include /private/etc/apach ...

  2. postgresql 的触发器

    今天编写了一个触发器 功能: 有两个表,当一个表的字段有所改动的时候,另一个表跟着改动 CREATE OR REPLACE FUNCTION process_emp_audit() RETURNS T ...

  3. Python函数式编程初级学习

    函数式编程即函数可以作为参数传入函数,也可以返回函数. 1.高阶函数     函数可以作为参数传入函数.     def add(x,y,f):         return f(x)+f(y)   ...

  4. 源码编译基于Android平台的XBMC笔记

    参考官方网站:https://github.com/xbmc/xbmc/blob/master/docs/README.android   1. 编译主机系统 Ubuntu (12.04) 64Bit ...

  5. MacOS 下端口占用解决办法

    现象:Mac下,IDEA正常关闭tomcat时,仍旧抛出8009 端口被占用. 解决: 1. 终端(命令行)上,输入命令 lsof -i tcp: 2. 找到这个进程的 PID,好吧,kill掉它 k ...

  6. Hadoop 学习笔记 (十一) MapReduce 求平均成绩

    china:张三 78李四 89王五 96赵六 67english张三 80李四 82王五    84赵六 86math张三 88李四 99王五 66赵六 77 import java.io.IOEx ...

  7. ios7新特性2--多任务提升

    iOS 7 为应用程序提供新的后台执行模式: 应用程序需要需要下载新内容,可以向系统注册,这样程序会被定期唤起或者启动,然后可以在后台下载内容.要注册这个功能,需要打开Info.plist 文件,设置 ...

  8. spoj PARTIT

    三维DP 第K字典序从左向右找 根据dp数组的值算出每一位该打印什么 代码: #include <cstdio> #include <cstring> using namesp ...

  9. ZooKeeper系列之八:ZooKeeper的简单操作

    http://blog.csdn.net/shenlan211314/article/details/6187035 1 )使用 ls 命令来查看当前 ZooKeeper 中所包含的内容: [zk: ...

  10. asp.net 类库中获取session c#类中获取session

    asp.net  类库中获取session c#类中获取session 1. 先引入命名空间 using System.Web; using System.Web.SessionState; 在使用H ...