代码之家  ›  专栏  ›  技术社区  ›  Hortitude

GWT如何实例化Java接口类

  •  1
  • Hortitude  · 技术社区  · 14 年前

    /**
     * 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;
    
    }
    

    我以为你不能实例化接口?

    谢谢!

    3 回复  |  直到 14 年前
        1
  •  3
  •   Jon Skeet    14 年前

    首先,它没有在接口上调用构造函数。这是完全有效的Java,在许多服务定位器框架中都是可以的。它只是调用一个方法,返回一些实现 GreetingServiceAsync 爪哇 编译器知道。

    执行 反正是Java。GWT将神奇地将所有客户端代码转换成JavaScript。它只需要知道远程路径是什么(所以它可以知道在哪里进行相关的服务调用)和签名是什么(所以Java实际上有一些东西要处理,所以它可以验证您是否向远程服务传递了适当的参数)。

    在执行死刑的时候 爪哇 完全反对。。。它将在JavaScript中执行一些操作,以便使RPC。。。然后在服务器端,您可以 真实的 侦听该请求的接口的实现。

        2
  •  2
  •   Thomas Broyer    14 年前

    它在使用 deferred binding ,在本例中,使用生成器在编译时动态创建接口的实现(在DevMode的情况下是运行时,但实际上它生成了动态编译的Java代码)

        3
  •  1
  •   Chris Lercher    14 年前

    这个 RPC Plumbing Diagram

    其中一些类,如 服务代理 ,是在后台自动生成的,通常您永远不会意识到它们的存在。

    让我们看看这些场景背后:

    我们从 /com/google/gwt/rpc/RPC.gwt.xml 在gwt-user.jar中:

    <generate-with class="com.google.gwt.rpc.rebind.RpcServiceGenerator">
      ...
      <when-type-assignable class="com.google.gwt.user.client.rpc.RemoteService" />
      ...
    </generate-with>
    

    它指定了 deferred binding ,正如托马斯·布罗耶所说。所以我们去 RpcServiceGenerator :

    ...
    return new RpcProxyCreator(remoteService);
    ...
    

    RpcProxyCreator 以及它的超类 ProxyCreator . 我相信, 你要找的代码在 ProxyCreator.getSourceWriter

    ...
    composerFactory.addImplementedInterface(
      serviceAsync.getErasedType().getQualifiedSourceName());
    ...