2012-02-15 39 views

回答

2

是的,这是可能的,但不是以正常的方式在JVM上执行 - 在运行时生成实现的代理类和其他方法不可用,但有GWT.create方法,它将通过您的重新绑定规则(在您创建的模块文件中声明,并且包含inherits条语句)并提供实现。

使用这些重新绑定规则的最简单方法是用一些更好的实现来代替接口或类 - 它使用<replace-with />标签,您可以指定要替换它的内容以及何时替换它。例如,当您使用的是Firefox,GWT将自动替换其底层DOM实现代码与壁虎特定版本:

<replace-with class="com.google.gwt.user.client.impl.DOMImplMozilla"> 
    <when-type-is class="com.google.gwt.user.client.impl.DOMImpl"/> 
    <when-property-is name="user.agent" value="gecko1_8"/> 
</replace-with> 

这不帮你,但需要了解的。

你能满足这些第二种方式是通过声明Generator类来提供你想要的实现。生成器扩展为com.google.gwt.core.ext.Generator,并且(通常)查看传递给它们的类以创建一个新类型并将其写出来,并返回其完全限定名称,然后将其用于您调用GWT.create(SomeClass.class)的地方。

在你的情况下,你会想看看接口MyInterface中的方法,并做一些事情,比如调用每个方法的返回值的默认构造函数。因此,通过发电机来获得MyInterface的实例,要求它这样的,而作为接口描述使用它:

MyInterface impl = GWT.create(MyInterface.class); 
ThingA a = impl.getThingA(); 

声明你的发电机,并在那里看到它,使用它应该更换你的MyInterface的像这样在你的模块文件的规则(按照惯例,就像GWT编译类的客户端软件包去,发电机在重新绑定包去):

<generate-with class="my.package.to.rebind.MyInterfaceGenerator"> 
    <when-type-is class="my.package.to.client.MyInterface" /> 
</generate-with> 

除此之外,你要看看一些已经在GWT代码库中的其他生成器(或者在核心GWT团队之外编写)。

原始ImageBundle(由ClientBundle取代)非常简单,它实际上如何使用ClassSourceFileComposerFactory创建其源文件并开始写入SourceWriter。大部分可在com.google.gwt.user.rebind.ui.ImageBundleGeneratorgenerategenerateImplClass方法中找到。

GWT的RPC由com.google.gwt.user.rebind.rpc.ServiceInterfaceProxyGenerator和``com.google.gwt.user.rebind.rpc产生。ProxyCreator - 使用起来有点复杂,但确实提供了一些很好的见解,包括使用标记接口来生成(而不是为每个新界面制定新的重新绑定规则,尽管它们几乎完成相同的事情)。

0

这不可能是可能的,因为这将需要字节码的创作,但在JavaScript中没有字节码和反射API是不是在GWT提供两种。

+0

不知道为什么倒票:)因为这是不可能的*没有创建具体的实现*。有权访问'GWT.create'并使用生成器创建实现是同样的事情。您只是通过从字符串创建Java代码来提供*具体实现*,因此它是在编译时完成的。在运行时没有办法做到这一点。 – Strelok 2012-02-15 22:57:20

+0

是的,你在技术上是正确的 - 虽然这项工作是在编译时完成的,并且结果不是(通常)可用于GWT以外的代码。答案是有效的,甚至有帮助,设置GWT的期望,所以我不知道为什么人们会投票它... – 2012-02-16 02:31:18

相关问题