Java注释处理:在其他生成的代码

时间:2017-05-15 11:49:04

标签: java annotation-processing javapoet

@GenerateInterface class A {}

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

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

interface IA {}

interface IB {
  void setA(IA a);
}

B使用正确的import语句编译好。但是,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());
});

methodExecutableElementp.asType()仅包含简单名称IA。此时,可能尚未生成IA,因此没有完全限定的名称。

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

有一种聪明的方法吗?我至少可以从已编译的类型中区分出编译类型吗?

修改:full code

1 个答案:

答案 0 :(得分:1)

我正在为我的Kripton Persistence Library使用注释处理器,但遇到类似的问题。我的问题相似但又不同:在生成的类中,我引用了同一轮生成的其他生成的类。

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

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

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