2015-04-28 3 views
4

Использование Java аннотаций процессоры я следующий тип:Получить TypeElement из Generic TypeParameterElement для Java Annotation Processor?

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

и:

public interface Proxy<T> { } 

У меня есть TypeElement из Proxy как:

TypeElement pProxyTypeElement = // ... 

Теперь я хочу, чтобы получить TypeElement от типового параметра <StartPagePresenter>.

Я пробовал:

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

При печати firstParameter.getSimpleName() я получаю T вместо StartPagePresenter.

Как получить реальный TypeElement StartPagePresenter от TypeParameter?

ответ

7

Чтобы получить доступ к общим параметрам, вам понадобится 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()); 
     } 
    } 

Если печать StartPagePresenter

Я предпочитаю использовать различные посетитель, поставляемые с API для сглаживания этого литья.

+0

Это отлично работает. – confile

+0

Хммм, мне интересно, почему я получил вниз. –

+0

Понятия не имею, это правильный ответ? – confile

Смежные вопросы