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