📅  最后修改于: 2021-01-02 12:59:23             🧑  作者: Mango
GWT JSNI用于解决问题,例如当我们需要将GWT与现有的手写JavaScript或与第三方JavaScript库集成时。有时,我们需要访问GWT类API未公开的低级浏览器功能。
JSNI在网络上等效于内联汇编代码,并且可以以多种方式使用,例如:
句法
package com.xyz.client;
public class Alert {
public static native void alert(String msg) /*-{
$wnd.alert(msg);
}-*/;
}
从Java调用JSNI方法与调用常规Java方法没有什么不同。
例
button1.addClickListener(new ClickListener() {
public void onClick(Widget sender) {
Alert.alert("clicked!");
}
});
调用者无法真正判断该方法是否是本机的。这为更改方法的实现方式提供了一定的灵活性。
这比从Java调用JSNI更为复杂。例如,假设我们将一个对象传递给JSNI方法,并且需要访问该对象中的字段或调用方法。我们需要知道GWT编译器如何管理Java字段和方法名称。它有助于从您自己的JavaScript代码访问字段。
句法
obj.@class::field
在哪里:
obj :它是被引用的对象实例。对于静态变量,请省略实例表达式和尾随时间段。
class :这是在其中声明字段的类(或其子类)的完全限定名称。
field :这是要访问的字段的名称。
调用方法使用与访问字段类似的语法,除了还提供方法调用的签名。 Java方法可以重载,即,两个方法可以具有相同的名称,但采用不同的参数。
句法
obj.@class::method(sig)(args)
在哪里:
obj :它是被引用的对象实例。对于静态方法,请省略实例表达式和尾随句点。
class:在此方法被声明(或其子类)。
method :它是被调用方法的名称。
JSNI方法签名与JNI方法签名完全相同,只是方法返回类型被保留。下表显示了类型签名:
Type Signature | Java Type |
---|---|
Z | Boolean |
B | Byte |
C | Char |
S | Short |
I | Int |
J | Long |
F | Float |
D | Double |
GWT JSNI示例
它演示了将数字,字符串,布尔值和Java对象传递到JavaScript中的方法。它还显示了JavaScript方法如何对传入的Java对象进行方法调用。
public class Javatpoint {
/** Pass a Java numeric primitive */
public static void testJavatpointNumeric() {
int x = 42;
jsNumeric(x);
}
/**
* Method jsNumeric.
* @param x int
*/
private static native void jsNumeric(int x) /*-{
$wnd.alert(?x is ? + x);
}-*/;
/** Pass a Java String */
public static void testJavatpointString() {
String s = "my string";
jsString(s);
}
/**
* Method jsString.
* @param s String
*/
private static native void jsString(String s) /*-{
$wnd.alert("s is " + s);
}-*/;
/** Pass a boolean */
public static void testJavatpointBoolean() {
boolean b = true;
jsBoolean(b);
}
/**
* Method jsBoolean.
* @param b boolean
*/
private static native void jsBoolean(boolean b) /*-{
$wnd.alert("b is " + b);
}-*/;
/** Pass an arbitrary Java Object */
public static void testJavatpointObject() {
MyJavaObject obj = new MyJavaObject();
jsObject(obj);
}
/**
* Method jsObject.
* @param obj MyJavaObject
*/
private static native void jsObject(MyJavaObject obj) /*-{
$wnd.alert("Calling getText(): " + obj.@MyJavaObject::getTextAt(I)(3));
}-*/;
}
Java Type | JavaScript Code Display |
---|---|
Java Numeric | JavaScript Numeric Value, int var x= 5. |
String | JavaScript String Value var x=”JavaTpoint”. |
Boolean | JavaScript Boolean Value var x= true. |
JavaScriptObject | JavaScriptObject which must have originated from JavaScript code. It should be the return value of some other JSNI method. |
Java array | An opaque value that can only be passed back into Java Code. |
Java Object | An opaque value that can be accessed through special syntax. |