从Generic TypeParameterElement获取Java Annotation Processor的TypeElement?

时间:2015-04-28 14:54:00

标签: java annotations annotation-processing

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

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

和:

public interface Proxy<T> { }

我的TypeElement Proxy为:

TypeElement pProxyTypeElement = // ...

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

我试过了:

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

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

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

1 个答案:

答案 0 :(得分:8)

要访问通用参数,您需要TypeMirror强制转换为DeclaredTypeDeclaredType有一个方法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());
        }
    }

应打印StartPagePresenter

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