[英]How to use GWT $entry Function in JSNI?
GWT中的$ entry函數用於獲取從JavaScript報告給GWT的未捕獲異常。
以下$ entry調用和正確的調用有什么區別?
以下版本調用實例Java函數。
版本1:
public final native String test(double arg) /*-{
var instance = this;
var callExternal = $entry(function(arg) {
return instance.@com.example.MyClass::javaFunction(D)(arg);
});
var x = callExternal(arg);
}-*/;
版本2:
public final native String test(double arg) /*-{
var x = $entry(instance.@com.example.MyClass::javaFunction(D)(arg));
}-*/;
我使用靜態或非靜態Java函數有其他用途嗎?
更新:
以下版本調用靜態Java函數。
版本1:
public final native String test(double arg) /*-{
var callExternal = $entry(function(arg) {
return@com.example.MyClass::javaFunction(D)(arg);
});
var x = callExternal(arg);
}-*/;
版本2:
public final native String test(double arg) /*-{
var x = $entry(@com.example.MyClass::staticJavaFunction(D)(arg));
}-*/;
第二個是錯誤的:它調用方法然后包裝結果。 它是無用的,甚至可能壞掉了。
$entry
將一個函數包裝在另一個使用try / catch的函數中。
題:
我使用靜態或非靜態Java函數有其他用途嗎?
回答:
使用instance
遵循instance.@com.example.MyClass::javaFunction(D)(arg);
訪問static
Java函數javaFunction
出錯instance.@com.example.MyClass::javaFunction(D)(arg);
錯誤:
Unnecessary qualifier on static method 'com.example.MyClass.javaFunction'
- 編輯 -
兩者都適用於靜態java函數,如下所示:
public static void staticJavaFunction(double d){
System.out.println(d);
}
public final native String test(double arg) /*-{
var x = $entry(@com.gwt.test.client.GWTTestProject::staticJavaFunction(D)(arg));
}-*/;
public final native String test(double arg) /*-{
var callExternal = $entry(function(arg) {
return @com.gwt.test.client.GWTTestProject::staticJavaFunction(D)(arg);
});
var x = callExternal(arg);
}-*/;
兩者對於非靜態java函數也都可以正常工作,如下所示:
注意:版本2中只有一個更改,其中var instance = this;
失蹤。
public void javaFunction(double d){
System.out.println(d);
}
public final native String test(double arg) /*-{
var instance = this;
var x = $entry(instance.@com.gwt.test.client.GWTTestProject::javaFunction(D)(arg));
}-*/;
public final native String test(double arg) /*-{
var instance = this;
var callExternal = $entry(function(arg) {
return instance.@com.gwt.test.client.GWTTestProject::javaFunction(D)(arg);
});
var x = callExternal(arg);
}-*/;
在這兩種情況下,我都傾向於使用版本2。
您可以嘗試:
public final native String test1(double arg) /*-{
var instance = this;
var x = $entry(function(a) {
return instance.@com.example.MyClass::javaFunction(D)(a);
})(arg);
return x;
}-*/;
對於靜態調用,您可以使用:
public final native String test2(double arg) /*-{
var x = $entry(@com.example.MyClass::staticJavaFunction(D))(arg);
return x;
}-*/;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.