从Generic TypeParameterElement获取Java Annotation Processor的TypeElement?

con*_*ile 5 java annotations annotation-processing

使用Java Annotation Processors我有以下类型:

@NameToken(value={"startPage"})
public interface MyProxy extends Proxy<StartPagePresenter> {
}
Run Code Online (Sandbox Code Playgroud)

和:

public interface Proxy<T> { }
Run Code Online (Sandbox Code Playgroud)

我有TypeElementProxy为:

TypeElement pProxyTypeElement = // ...
Run Code Online (Sandbox Code Playgroud)

现在我想获得Type参数的TypeElement <StartPagePresenter>.

我试过了:

List<? extends TypeParameterElement> proxyTypeParamElems = 
                                         proxyTypeElement.getTypeParameters();
TypeParameterElement firstParameter = proxyTypeParamElems.get(0);
Run Code Online (Sandbox Code Playgroud)

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

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

Joh*_*sen 9

要访问通用参数,您需要使用TypeMirror强制转换DeclaredType. DeclaredType有一个方法getTypeArguments(),返回一个列表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());
        }
    }
Run Code Online (Sandbox Code Playgroud)

应该打印 StartPagePresenter

我更喜欢使用随API提供的各种访问者来平滑这个转换.