从JSNI调用Java方法

Ant*_*lov 1 javascript gwt jsni

我有一个班级,例如:

public class Person {

    private String name;

    public Person(String name) {
        this.name = name;
    }

    public void sayName() {
        System.out.println(name);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我调用这样的方法(或者我的无知或错误),它会起作用吗:

public native void someMethod (Person person) /*-{
    person.sayName();
}-*/;
Run Code Online (Sandbox Code Playgroud)

Ada*_*dam 5

JavaScript文档中访问Java方法和字段:

语法是:

[instance-expr.]@class-name::method-name(param-signature)(arguments)
Run Code Online (Sandbox Code Playgroud)
  • 实例EXPR.:调用实例方法时必须存在,调用静态方法时必须不存在

  • class-name:是声明方法的类的完全限定名称(或其子类)

  • param-signature:是JNI类型签名中指定的内部Java方法签名,但没有方法返回类型的尾随签名,因为不需要选择重载

  • arguments:是传递给被调用方法的实际参数列表

这是JNI类型签名:

Type Signature               Java Type
Z                            boolean
B                            byte
C                            char
S                            short
I                            int
J                            long
F                            float
D                            double
L fully-qualified-class ;    fully-qualified-class
[ type                       type[]
( arg-types ) ret-type       method type

For example, the Java method:

long f (int n, String s, int[] arr); 
has the following type signature:

(ILjava/lang/String;[I)J
Run Code Online (Sandbox Code Playgroud)

在你的情况下(没有参数)它将是:

public native void someMethod (Person person) /*-{
    person.@your.package.name.client.Person::sayName()();
}-*/;
Run Code Online (Sandbox Code Playgroud)

替换your.package.name为真实的包名称.