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

使用GWT和Guice,是否可以自动创建接口的实例?,gwt,guice,Gwt,Guice,如果我有这样一个界面 public interface MyInterface{ public ThingA getThingA(); } ThingA在哪里 public class ThingA{ public ThingA(){} } 有了GWT和Guice,是否可以在不提供具体实现的情况下创建MyInterface的默认实例?这是不可能的,因为这需要创建字节码,但在javascript中没有字节码,GWT中也没有反射API。是的,这是可能的,但这不是在JVM上执行的

如果我有这样一个界面

public interface MyInterface{
     public ThingA getThingA();
}
ThingA在哪里

public class ThingA{
    public ThingA(){}
}

有了GWT和Guice,是否可以在不提供具体实现的情况下创建MyInterface的默认实例?

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

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

使用这些重新绑定规则最简单的方法就是用更好的实现替换接口或类-这使用
标记,您可以指定替换它的内容以及替换它的时间。例如,当您使用Firefox时,GWT会自动将其底层dom实现代码替换为特定于gecko的版本:

<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>
要声明生成器,并在它看到的地方替换MyInterface,请在模块文件中使用类似的规则(按照惯例,就像GWT可编译类放在客户机包中一样,生成器放在重新绑定包中):


除此之外,您还需要了解GWT代码库中已有的一些其他生成器(或在核心GWT团队之外编写的生成器)的功能

原始的ImageBundle(现在被ClientBundle取代)非常简单,它使用
classSourceFileComposer工厂创建其源文件,并开始写入
SourceWriter
。大部分内容可以在
com.google.gwt.user.rebind.ui.ImageBundleGenerator
generate
generateImplClass
方法中找到


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

不确定为什么会有反对票:),因为如果不创建具体的实现,这是不可能的。访问
GWT.create
和让生成器创建实现是一样的。您提供了一个具体的实现,只是通过从字符串创建Java代码,所以它是在编译时完成的。在运行时没有办法做到这一点。是的,您在技术上是正确的——尽管这项工作是在编译时完成的,并且结果(通常)不可由GWT以外的代码使用。答案是正确的,甚至是有帮助的,设定了对GWT的期望,所以我也不知道为什么人们会投票否决它。。。
MyInterface impl = GWT.create(MyInterface.class);
ThingA a = impl.getThingA();
<generate-with class="my.package.to.rebind.MyInterfaceGenerator">
  <when-type-is class="my.package.to.client.MyInterface" />
</generate-with>