Java注解处理:在其他生成的代码中引用生成的类型


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

我的注释处理器应生成以下接口:

interface IA {}
interface IB {
  void setA(IA a);
}

B使用正确的导入语句编译良好。 但是,IB 错过了参数IA a 。我使用javapoet来生成接口。用于编译方法参数的代码:

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());
});

method是一个ExecutableElement. p.asType()只持有简单的名称IA。此时,可能尚未生成IA,因此没有完全限定的名称可用。

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

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

编辑:完整代码

我正在为我的 Kripton 持久性库开发注释处理器,我遇到了类似的问题。我的问题相似但不相同:在我的生成类中,我引用了在同一轮中生成的其他生成的类。

我应用的解决方案只是手动"生成"TypeName。在我的注释处理器中,我使用一个特定的类,你可以在这里找到哪个来源。

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

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

相关内容

  • 没有找到相关文章

最新更新