我正在尝试使用生成器来实现延迟绑定。当我在开发人员模式下测试延迟绑定时,它按预期方式工作,当我切换到生产时,由于某种原因延迟绑定不起作用。
我有以下课程

public class GeneratorTest implements EntryPoint {

    //should be modified by generator
    public static class GeneratorTestPrefs extends PreferencesImpl {
...
    }
...
}

public class PreferencesImpl implements Preferences {
...
}

public interface Preferences {

    public void load(String key, Storage storage);

    public void store(String key, Storage storage);
}


然后在gwt module.xml中定义

<generate-with class="com.xxx.xxx.gwt.generator.server.PreferencesGenerator">
    <when-type-assignable class="com.xxx.xxx.gwt.generator.client.Preferences"/>
</generate-with>


我为创建的类添加了日志

GeneratorTestPrefs prefs = GWT.create(GeneratorTestPrefs.class)


在开发模式下,在日志文件中,我看到GWT使用的是生成器创建的类(GeneratorTestPrefs_PreferencesAdapter)

[java] INFO: deferred binding: com.xxx.xxx.gwt.generator.client.GeneratorTestPrefs_PreferencesAdapter


在生产模式下,在日志文件中,我看到GWT没有使用生成器创建的类(GeneratorTest $ GeneratorTestPrefs)

Wed Apr 01 15:48:06 GMT+300 2015 com.xxx.xxx.gwt.generator.client.GeneratorTest INFO: deferred binding: com.xxx.xxx.gwt.generator.client.GeneratorTest$GeneratorTestPrefs


我不知道怎么了。我想念什么吗?难道我做错了什么?

先感谢您!

最佳答案

在生成器中是无效的实现。当已经生成类时,它返回null,因此,仅在某些排列上使用了正确的版本

public String generate(TreeLogger logger, .....) ...{
    String className = null;
    if (printWriter != null) {
        SourceWriter writer = composer.createSourceWriter(ctx, printWriter);
        ....
        className = composer.getCreatedClassName();
    }
    return className;
}


当我改变

    String className = packageName + "." + simpleName;


它开始按预期工作。

07-27 13:45