gpt4 book ai didi

Java注解处理: reference generated type in other generated code

转载 作者:行者123 更新时间:2023-11-30 06:43:55 34 4
gpt4 key购买 nike

@GenerateInterface class A {}

@GenerateInterface class B {
void setA(IA a) {}
}

我的注释处理器应该生成这些接口(interface):

interface IA {}

interface IB {
void setA(IA a);
}

B 使用正确的导入语句可以正常编译。然而,IB 错过了参数IA a。我用javapoet生成接口(interface)。编译方法参数的代码:

method.getParameters().forEach(p -> {
ParameterSpec.Builder parameterBuilder = ParameterSpec.builder(
TypeName.get(p.asType()),
p.getSimpleName().toString(),
p.getModifiers().toArray(new Modifier[p.getModifiers().size()]));
p.getAnnotationMirrors().stream()
.map(AnnotationSpec::get)
.forEach(parameterBuilder::addAnnotation);
methodBuilder.addParameter(parameterBuilder.build());
});

方法是一个ExecutableElementp.asType() 仅保存简单名称IA。此时,IA 可能尚未生成,因此没有可用的完全限定名称。

目前,我为每个带注释的类一一生成接口(interface)。据我了解,我首先需要所有带注释的类及其派生接口(interface)名称的列表。然后,当我遇到尚未生成类型的参数时,从上面的列表中获取完全限定名称以插入正确的导入语句。

有什么聪明的方法可以做到这一点吗?我至少可以区分尚未编译的类型和已编译的类型吗?

编辑:full code

最佳答案

我正在为我的 Kripton Persistence Library 开发注释处理器我也有类似的问题。我的问题类似但不相同:在我生成的类中,我引用同一轮中生成的其他生成的类。

我应用的解决方案只是手动“生成”TypeName。在我的注释处理器中,我使用一个特定的类,您可以找到该类的来源 here .

Kripton 将为 Android 平台生成实现基于 SQLite 的 DAO 模式的类。当我生成数据源时,我需要引用将在同一轮中生成的 DAO 类。为了做到这一点并避免出现同样的问题,我生成了关联的 TypeName。您可以在类 BindDataSourceBuilder 的方法 buildDataSource 上看到这一点.

希望这些信息对您仍然有用。

关于Java注解处理: reference generated type in other generated code,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43978743/

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