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

14

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

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

那么我应该如何使用javax.lang.model中的VariableElement(它可能代表一个字段,也可能不是)?对应的返回值可能是TypeElement

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

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

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

2个回答

10

嗯,我不确定这是否是正确的方法。
如果有人真正理解这个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中获取,因为它的一些内部取决于它,所以它不是一个通常的实用类。


2
我在尝试理解新的JDK Doclet混乱代码时偶然发现了这个问题。接受的答案对我无效,因为Doclet有各种不能使用的内部类。此外,该答案更类似于“如何将TypeMirror转换为TypeElement”;鉴于java.lang.model SO问题和答案的稀缺性,我还是决定发布这个问题。

这是我所做的:


Translated:
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,它是一个类/接口的“类型”,你可以这样做将TypeMirror转换为TypeElement。"最初的回答":当您拥有一个表示类/接口“种类”的TypeElement t时,您可以执行以下操作将TypeMirror转换为TypeElement。
TypeMirror   p = t.getSuperclass();
TypeElement pe = (TypeElement) typeUtils.asElement(p);

我希望你能够从这里获得帮助。
最初的回答:

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接