从 Java 注释处理器的通用 TypeParameterElement 获取 TypeElement?

Get TypeElement from Generic TypeParameterElement for Java Annotation Processor?

使用 Java 注释处理器我有以下类型:

@NameToken(value={"startPage"})
public interface MyProxy extends Proxy<StartPagePresenter> {
}

和:

public interface Proxy<T> { }

我有 ProxyTypeElement 作为:

TypeElement pProxyTypeElement = // ...

现在我想获取类型参数<StartPagePresenter>的TypeElement。

我试过了:

List<? extends TypeParameterElement> proxyTypeParamElems = 
                                         proxyTypeElement.getTypeParameters();
TypeParameterElement firstParameter = proxyTypeParamElems.get(0);

当我打印 firstParameter.getSimpleName() 时,我得到 T 而不是 StartPagePresenter

如何从 TypeParameter 中获取真正的 TypeElement StartPagePresenter?

要访问通用参数,您需要将 TypeMirror 转换为 DeclaredTypeDeclaredType 有一个方法 getTypeArguments(),其中 returns 一个 TypeMirror 的列表,表示具体声明的泛型参数:

按照你的例子:

    Set<? extends Element> proxyElements = roundEnvironment.getElementsAnnotatedWith(NameToken.class);

    for(Element element : proxyElements){
        TypeElement typeElement = (TypeElement)element;
        DeclaredType declaredType = (DeclaredType)typeElement.getInterfaces().get(0); //assuming there is an interface

        for(TypeMirror genericParameter : declaredType.getTypeArguments()){
            messager.printMessage(Diagnostic.Kind.NOTE, genericParameter.toString());
        }
    }

应该打印 StartPagePresenter

我更喜欢使用 API 提供的各种访问者来平滑此转换。