使用GWT和Guice,是否可以自动创建接口实例?

时间:2012-02-15 13:21:29

标签: gwt guice

如果我有这样的界面

public interface MyInterface{
     public ThingA getThingA();
}

ThingA在哪里

public class ThingA{
    public ThingA(){}
}

使用GWT和Guice可以在不提供具体实现的情况下创建MyInterface的默认实例吗?

2 个答案:

答案 0 :(得分:2)

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

使用这些重新绑定规则的最简单方法是使用更好的实现替换接口或类 - 这使用<replace-with />标记,您可以指定替换它的内容,以及何时替换它它。例如,当您使用Firefox时,GWT会自动使用gecko特定版本替换其底层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时非常简单。其中大部分内容可以在generate的{​​{1}}和generateImplClass方法中找到。

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

答案 1 :(得分:0)

这是不可能的,因为这需要字节码创建,但在javascript中没有字节码,并且GWT中也没有反射API。