对于 GWT 客户端代码,您可以使用延迟绑定在编译时生成 Java 代码。您创建一个com.google.gwt.core.ext.Generator
. Google 使用延迟绑定进行 ie 本地化等。我用它为 GWT 实现了一个简单的 XML 映射器,但这是封闭源代码。
例如,您创建一个接口com.foo.Constants
:
public interface Constants {
int getY();
int getZ();
}
并为您的常量创建一个生成器:
public class ConstantsGenerator extends Generator {
private static final String PACKAGE_NAME = "com.foo";
private static final String SIMPLE_CLASS_NAME = "GeneratedConstants";
private static final String CLASS_NAME = PACKAGE_NAME + "." + SIMPLE_CLASS_NAME;
@Override
public String generate(TreeLogger logger, GeneratorContext context,
String typeName) throws UnableToCompleteException {
// Get a SourceWriter to create the class GeneratedConstants.
// If it returns null, then this class was already created during this compilation
// step and we only return the name of class.
final SourceWriter sourceWriter = getSourceWriter(logger, context);
if(sourceWriter != null) {
// Otherwise create the new class ...
generateConstantsClass(sourceWriter, logger);
}
return CLASS_NAME;
}
private SourceWriter getSourceWriter(TreeLogger logger, GeneratorContext context) {
final ClassSourceFileComposerFactory composer =
new ClassSourceFileComposerFactory(PACKAGE_NAME, SIMPLE_CLASS_NAME);
// The generated class implements com.foo.Constants
composer.addImplementedInterface("com.foo.Constants");
// Add some imports, if needed
// composer.addImport("java.util.Map");
final PrintWriter printWriter = context.tryCreate(logger, PACKAGE_NAME, SIMPLE_CLASS_NAME);
if(printWriter == null)
return null;
else {
final SourceWriter sw = composer.createSourceWriter(context, printWriter);
return sw;
}
}
private void generateConstantsClass(SourceWriter sourceWriter, TreeLogger logger) {
final int y = calculateY(); // Do here the heavy calculation for y.
final int z = calculateZ(); // Do here the heavy calculation for z.
// Create the source code for the two Methods getY() and getZ().
sourceWriter.println(String.format("public int getY() { return %d; }", y));
sourceWriter.println(String.format("public int getZ() { return %d; }", z));
sourceWriter.commit(logger);
}
}
然后你必须配置你的 GWT 模块 XML 文件:
<generate-with class="com.foo.ConstantsGenerator">
<when-type-assignable class="com.foo.Constants" />
</generate-with>
然后在您的 GWT 客户端代码中,您可以像这样创建生成的类的实例:
public Constants getConstants() {
return (Constants) GWT.create(Constants.class);
}
但这仅适用于客户端代码。只预先计算一些值可能有点太多的开销。
在构建脚本中包含代码生成步骤会更容易。然后,您可以在服务器和客户端代码中使用您生成的类。
但是对于预先计算的值,这仍然可能是太多的开销。如果您只使用预先计算的值生成一个简单的文件(如属性文件)并在运行时加载它,则可以完全避免生成代码。
在服务器端,这应该没问题。对于客户端,您可以使用 JSP 生成 GWT 主机页面,并将预先计算的值包含为 JavaScript 字典。在 GWT 代码中,很容易访问这些值。