我正在尝试使用 JSNI 为 GWT 的 WebSockets 创建一个简单的绑定,但是每次调用 JSNI 方法时我都会收到异常。简化的类定义如下:
public class Socket extends JavaScriptObject{
protected Socket() {}
public static native Socket connect(String url) /*-{
return new WebSocket(url);
}-*/;
}
在尝试实例化 Socket 对象时,使用以下行:
Socket socket = Socket.connect("http://www.google.com");
我得到了休闲异常,我不知道为什么:
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.google.gwt.dev.shell.ModuleSpace.onLoad(ModuleSpace.java:396)
at com.google.gwt.dev.shell.OophmSessionHandler.loadModule(OophmSessionHandler.java:193)
at com.google.gwt.dev.shell.BrowserChannelServer.processConnection(BrowserChannelServer.java:510)
at com.google.gwt.dev.shell.BrowserChannelServer.run(BrowserChannelServer.java:352)
at java.lang.Thread.run(Thread.java:662)
Caused by: java.lang.ClassFormatError: Illegal method name "$" in class edu/catalindumitru/gwt/socket/Socket
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
at java.lang.ClassLoader.defineClass(ClassLoader.java:465)
at com.google.gwt.dev.shell.CompilingClassLoader.findClass(CompilingClassLoader.java:1078)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
at edu.catalindumitru.gwt.steel.client.GameCore.onModuleLoad(GameCore.java:32)
... 9 more
我之前曾尝试为类型化数组和网络工作者创建类似的绑定,但我得到了完全相同的错误,所以我决定暂停这些绑定的开发并尝试一些更简单的方法,直到我找到这个异常的原因。