从在Java注释处理器中扩展泛型类型的类型中提取具体类型参数

时间:2014-11-17 18:43:58

标签: java annotation-processing

考虑我有一个类型:

interface Foo<T> {
  boolean foo();
}

我这样创建BarFoo:

class BarFoo implements Foo<Bar> {
  boolean foo();
}

在Java6 Annotation Processor中,可以访问TypeElement BarFoo,如何在实现Foo(特别是Bar)的上下文中发现这个非泛型子类参数化的具体类型。

此外,当我有一个更复杂的层次结构时,如何:

interface Foo<T> {
  boolean foo();
}

class BarFoo implements Foo<Bar> {
  boolean foo();
}

class Grandchild extends BarFoo {}

如果给出Grandchild的TypeElement,我能找到Foo类型参数的类型吗?

请注意 - 我不需要知道将执行此操作的反射API,但特别是javax.lang.model和javax.annotation.processing API将使我在此方案中Bar。< / p>

编辑:我将返回类型从T更改为boolean,因为在我的实际案例中,我没有任何返回T的方法可能证明是一种解决方法。遗憾的是,我需要从类型层次结构中获取它,而不是从方法返回类型中获取它。

1 个答案:

答案 0 :(得分:4)

我会尝试:

  • TypeElement.getInterfaces() - &gt; List<? extends TypeMirror>
  • TypeMirror.accept(...)访问者检查DeclaredType
  • DeclaredType.getTypeArguments() - &gt; List<? extends TypeMirror>应为TypeElement
  • 提供Bar

对于Grandchild可能是相同的方案,但首先是getSuperclass()

另一种选择是从Foo开始,检查getTypeParameters(),它会为您提供T,然后查找TgetReturnType()的方法,然后寻找该方法的实现(如果考虑签名而不仅仅是名称,可能不那么容易),最后找出哪个返回类型具有实现。但这更为复杂。