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

在 中,可以执行以下操作:java.lang.reflect

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

但是,我该如何处理 的 VariableElement(它可能表示也可能不表示字段)?相应的返回值将是(我猜)。javax.lang.modelTypeElement

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

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

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


答案 1

嗯,我不知道,这是正确的方法。
如果有人真正了解这个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;
  }
}

似乎该类必须从当前获取,因为它的一些内部依赖于它,因此它不是通常的实用程序类。TypesProcessingEnvironment


答案 2

我偶然发现了这一点,试图从新的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);

我希望这可以帮助某人。