gpt4 book ai didi

java - GWT 生成器获取编译时间

转载 作者:行者123 更新时间:2023-11-30 02:38:18 25 4
gpt4 key购买 nike

我正在尝试了解 GWT 生成器,但遇到了一些问题。我正在尝试使用生成器在应用程序中显示编译时间并遇到此错误 -

Rebind result 'com.example.client.Function' must be a class

这是我所拥有的 -

这就是我调用生成方法的方式 -

Function b = GWT.create(Function.class);
label.setText(b.getBuildTime());

gwt.xml-

<generate-with class="example.frontend.client.gin.FunctionGenerator">
<when-type-assignable class="com.example.frontend.client.gin.Function" />
</generate-with>

函数.java

package com.example.frontend.client.gin;

public interface Function{
public String getBuildTime();
}

生成器类 -

package com.example.frontend.egenerator;

import java.io.PrintWriter;
import java.util.Date;

import com.google.gwt.core.ext.Generator;
import com.google.gwt.core.ext.GeneratorContext;
import com.google.gwt.core.ext.TreeLogger;
import com.google.gwt.core.ext.UnableToCompleteException;
import com.google.gwt.core.ext.typeinfo.JClassType;
import com.google.gwt.core.ext.typeinfo.TypeOracle;
import com.google.gwt.user.rebind.ClassSourceFileComposerFactory;
import com.google.gwt.user.rebind.SourceWriter;
import com.example.frontend.client.gin.Function;

public class FunctionGenerator extends Generator {
private static final String IMPL_TYPE_NAME = Function.class.getSimpleName() + "Impl";
private static final String IMPL_PACKAGE_NAME = Function.class.getPackage().getName();


@Override
public String generate(final TreeLogger logger, final GeneratorContext context, final String requestedClass) throws UnableToCompleteException {
TypeOracle typeOracle = context.getTypeOracle();
JClassType functionType = typeOracle.findType(requestedClass);
assert Function.class.equals(functionType.getClass());
ClassSourceFileComposerFactory composerFactory = new ClassSourceFileComposerFactory(IMPL_PACKAGE_NAME, IMPL_TYPE_NAME);
composerFactory.addImport(Function.class.getCanonicalName());
composerFactory.addImplementedInterface(Function.class.getName());
PrintWriter printWriter = context.tryCreate(logger, IMPL_PACKAGE_NAME, IMPL_TYPE_NAME);
SourceWriter sourceWriter = composerFactory.createSourceWriter(context, printWriter);
if(sourceWriter != null) {
sourceWriter.print("public String getBuildTime() {");
sourceWriter.print(" return \"" + new Date() + "\" ;");
sourceWriter.print("}");
sourceWriter.commit(logger);
}
return IMPL_PACKAGE_NAME + "." + IMPL_TYPE_NAME;
}
}

有什么想法吗?我缺少什么?

最佳答案

我相信您还需要对 tryCreate 创建的 PrintWriter 进行 null 检查,因为它可能返回 null。另一方面,createSourceWriter 不会返回 null,因此无需进行 null 检查。

您的生成方式也不正确,至少对于您此处的示例而言是如此。它应该有一个不同的包(至少根据您的FunctionGenerator源),com.example.frontend.egenerator,而不是com.example.frontend.client。 Gin :

<generate-with class="com.example.frontend.egenerator.FunctionGenerator">
<when-type-assignable class="com.example.frontend.client.gin.Function" />
</generate-with>

一般来说,您的生成器不应该位于 client 包中,如果没有其他原因,只是为了防止导致编译器速度减慢的虚假错误(并且确实减慢 super 速度)开发模式)。

<小时/>

除此之外,完整的日志可以极大地帮助追踪问题,尽管如果没有正确映射生成器,就不会有太大的错误。另外,在使用生成器时,请务必在打开 strict 的情况下进行编译,以确保编译器尽快失败,并且您可以在出现第一个错误时停止。

<小时/>综上所述,此时应避免使用新的生成器 - 它们会稍微减慢 super 开发模式的速度(因为它们必须在每次刷新时重新运行),并且在未来版本中将不再支持它们总重量。注释处理器(又名 APT)是执行此操作的首选方法,但在您的情况下,您也可以使用插件在 ant 或 maven 中生成类。

关于java - GWT 生成器获取编译时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42499274/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com