从 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> { }
我有 Proxy
的 TypeElement
作为:
TypeElement pProxyTypeElement = // ...
现在我想获取类型参数<StartPagePresenter>
的TypeElement。
我试过了:
List<? extends TypeParameterElement> proxyTypeParamElems =
proxyTypeElement.getTypeParameters();
TypeParameterElement firstParameter = proxyTypeParamElems.get(0);
当我打印 firstParameter.getSimpleName()
时,我得到 T
而不是 StartPagePresenter
。
如何从 TypeParameter 中获取真正的 TypeElement
StartPagePresenter?
要访问通用参数,您需要将 TypeMirror
转换为 DeclaredType
。 DeclaredType
有一个方法 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 提供的各种访问者来平滑此转换。
使用 Java 注释处理器我有以下类型:
@NameToken(value={"startPage"})
public interface MyProxy extends Proxy<StartPagePresenter> {
}
和:
public interface Proxy<T> { }
我有 Proxy
的 TypeElement
作为:
TypeElement pProxyTypeElement = // ...
现在我想获取类型参数<StartPagePresenter>
的TypeElement。
我试过了:
List<? extends TypeParameterElement> proxyTypeParamElems =
proxyTypeElement.getTypeParameters();
TypeParameterElement firstParameter = proxyTypeParamElems.get(0);
当我打印 firstParameter.getSimpleName()
时,我得到 T
而不是 StartPagePresenter
。
如何从 TypeParameter 中获取真正的 TypeElement
StartPagePresenter?
要访问通用参数,您需要将 TypeMirror
转换为 DeclaredType
。 DeclaredType
有一个方法 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 提供的各种访问者来平滑此转换。