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)
我有TypeElement的Proxy为:
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?
要访问通用参数,您需要使用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提供的各种访问者来平滑这个转换.