GWT如何实例化Java接口类
我创建了默认的“hello world”GWT应用程序,并注意到它有以下默认代码:GWT如何实例化Java接口类,java,gwt,Java,Gwt,我创建了默认的“hello world”GWT应用程序,并注意到它有以下默认代码: /** * Create a remote service proxy to talk to the server-side Greeting service. */ private final GreetingServiceAsync greetingService = GWT.create(GreetingService.class); 我想知道这是怎么可能的,因为迎宾服务的声明是: @RemoteSe
/**
* Create a remote service proxy to talk to the server-side Greeting service.
*/
private final GreetingServiceAsync greetingService = GWT.create(GreetingService.class);
我想知道这是怎么可能的,因为迎宾服务的声明是:
@RemoteServiceRelativePath("greet")
public interface GreetingService extends RemoteService {
String greetServer(String name) throws IllegalArgumentException;
}
我以为你不能实例化接口
谢谢 首先,它不是在接口上调用构造函数。这是非常有效的Java,在许多服务定位器框架中都可以。它只是调用一个方法,返回Java编译器所知的实现
GreetingServiceAsync
的内容
接下来要记住的是,它无论如何都不会作为Java执行。GWT将神奇地将所有客户端代码翻译成JavaScript。它只需要知道远程路径是什么(这样它就可以知道在哪里进行相关的服务调用)和签名是什么(这样Java实际上有一些东西可以使用,这样它就可以验证您是否向远程服务传递了适当的参数)
在执行时,这根本不是在构建Java对象。。。它将在JavaScript中执行一些操作,以便它可以使RPC。。。然后在服务器端,您可以让接口的实际实现监听该请求。首先,它不是在接口上调用构造函数。这是非常有效的Java,在许多服务定位器框架中都可以。它只是调用一个方法,返回Java编译器所知的实现
GreetingServiceAsync
的内容
接下来要记住的是,它无论如何都不会作为Java执行。GWT将神奇地将所有客户端代码翻译成JavaScript。它只需要知道远程路径是什么(这样它就可以知道在哪里进行相关的服务调用)和签名是什么(这样Java实际上有一些东西可以使用,这样它就可以验证您是否向远程服务传递了适当的参数)
在执行时,这根本不是在构建Java对象。。。它将在JavaScript中执行一些操作,以便它可以使RPC。。。然后在服务器端,您可以有一个真正的接口实现来监听该请求。它正在使用,在本例中,它使用一个生成器在编译时动态创建接口的实现(在DevMode的情况下是运行时,但实际上它会生成动态编译的Java代码)它使用生成器在编译时动态创建接口的实现(或者在DevMode的情况下是运行时,但实际上它会生成动态编译的Java代码)提到:
其中一些类,例如服务代理,是在后台自动生成的,您通常不会意识到它们的存在
让我们看看这些场景的背后:
我们将从gwt-user.jar中的/com/google/gwt/rpc/rpc.gwt.xml
开始:
<generate-with class="com.google.gwt.rpc.rebind.RpcServiceGenerator">
...
<when-type-assignable class="com.google.gwt.user.client.rpc.RemoteService" />
...
</generate-with>
现在,您可以详细了解RpcProxyCreator
的相对复杂的代码及其超类ProxyCreator
。我相信,,
您要查找的代码段位于ProxyCreator.getSourceWriter
:
...
composerFactory.addImplementedInterface(
serviceAsync.getErasedType().getQualifiedSourceName());
...
报告提到:
其中一些类,例如服务代理,是在后台自动生成的,您通常不会意识到它们的存在
让我们看看这些场景的背后:
我们将从gwt-user.jar中的/com/google/gwt/rpc/rpc.gwt.xml
开始:
<generate-with class="com.google.gwt.rpc.rebind.RpcServiceGenerator">
...
<when-type-assignable class="com.google.gwt.user.client.rpc.RemoteService" />
...
</generate-with>
现在,您可以详细了解RpcProxyCreator
的相对复杂的代码及其超类ProxyCreator
。我相信,,
您要查找的代码段位于ProxyCreator.getSourceWriter
:
...
composerFactory.addImplementedInterface(
serviceAsync.getErasedType().getQualifiedSourceName());
...
它如何确定相关的实施?我以为“Create”调用会尝试实例化您传入的任何类?@hortude:请参阅我重写的答案。当应用程序以编译(JavaScript)形式执行时,这是真的。但由于GWT还提供了一种开发模式(在Java中执行),因此它必须能够创建Java对象。为此,使用了延迟绑定和Java代码生成器。当您打开
-gen
编译器选项时,您可以看到这些生成的类。@chris\l:很有兴趣知道,谢谢。我认为最重要的一点是,它一开始并不是无效的Java——重要的是要理解尝试在接口上调用构造函数与调用将返回接口实现的静态方法之间的区别(您不应该关心实现是什么样的).如何确定相关实施?我以为“Create”调用会尝试实例化您传入的任何类?@hortude:请参阅我重写的答案。当应用程序以编译(JavaScript)形式执行时,这是真的。但由于GWT还提供了一种开发模式(在Java中执行),因此它必须能够创建Java对象。为此,使用了延迟绑定和Java代码生成器。当您打开-gen
编译器选项时,您可以看到这些生成的类。@chris\l:很有兴趣知道,谢谢。我认为最重要的一点是,它一开始并不是无效的Java——重要的是要理解尝试在接口上调用构造函数与调用将返回接口实现的静态方法之间的区别(您不应该关心实现是什么样的)。可能的@Kirk Bozho链接副本是关于GWT的@Kirk Bozho链接副本可能是关于GWT的