javax.lang.model:如何获取字段的类型?

问题描述 投票:13回答:2

java.lang.reflect,人们可以这样做:

Field someField = ...;
Class<?> fieldType = someField.getType();

但是我如何处理javax.lang.modelVariableElement(可能代表或不代表某个领域)?相应的返回值将是(我猜)TypeElement

VariableElement someField = ...;
TypeElement fieldType = someField.???;

那么,在javax.lang.model中,我如何获得由TypeElement表示的字段的类型(或VariableElement)?

顺便说一下,没有一个适合javax.lang.model的Stackoverflow标签;)

java reflection types mirror annotation-processing
2个回答
7
投票

嗯,我不知道,这是正确的方法。 如果真正理解这个API的人告诉我,那会很好。

但是,接缝工作。

public class SomeClass {
  private final ProcessingEnvironment pe = /* get it somewhere */;
  private final Types typeUtils = pe.getTypeUtils();

  public TypeElement getExtracted(VariableElement ve) {
    TypeMirror typeMirror = ve.asType();
    Element element = typeUtils.asElement(typeMirror);

    // instanceof implies null-ckeck
    return (element instanceof TypeElement)
        ? (TypeElement)element : null;
  }
}

似乎Types类必须从当前的ProcessingEnvironment获得,因为它的一些内部依赖于它,因此它不是通常的实用类。


0
投票

我偶然发现了这个试图理解新的JDK Doclet毛球。接受的答案对我不起作用,因为,Doclet有各种不能使用的内部类。此外,这个答案更类似于“我如何将TypeMirror转换为TypeElement”;鉴于java.lang.model缺乏SO问题+答案,我想我还是会发布这个。

这是我做的:

import javax.lang.model.util.Elements;
import javax.lang.model.util.Types;

@Override
public boolean run(DocletEnvironment docEnv) {
    ...        
    elementUtils = docEnv.getElementUtils();
    typeUtils    = docEnv.getTypeUtils();
    ...
}

当你有一个TypeElement t是一个类/接口“kind”时,你可以做类似这样的事情从TypeMirror转到TypeElement。

TypeMirror   p = t.getSuperclass();
TypeElement pe = (TypeElement) typeUtils.asElement(p);

我希望这可以帮助别人。

© www.soinside.com 2019 - 2024. All rights reserved.