@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());
});
method
是ExecutableElement
。 p.asType()
仅包含简单名称IA
。此时,可能尚未生成IA
,因此没有完全限定的名称。
目前,我为每个带注释的类逐个生成接口。据我所知,我首先需要一个所有带注释的类及其派生接口名称的列表。然后当我遇到一个尚未生成类型的参数时,从上面的列表中获取完全限定名称以插入正确的import语句。
有一种聪明的方法吗?我至少可以从已编译的类型中区分出编译类型吗?
修改:full code
答案 0 :(得分:1)
我正在为我的Kripton Persistence Library使用注释处理器,但遇到类似的问题。我的问题相似但又不同:在生成的类中,我引用了同一轮生成的其他生成的类。
我适用的解决方案是手动“生成” TypeName。在我的注释处理器中,我使用一个特定的类,您可以在here中找到该源。
Kripton将为Android平台生成实现基于SQLite的DAO模式的类。生成数据源时,需要引用将在同一回合中生成的DAO类。为此,避免出现同样的问题,我生成了关联的TypeName。您可以在类BindDataSourceBuilder的方法buildDataSource
上看到它。
希望这些信息对您仍然有用。