14

java.lang.reflect中,一个人会这样做:

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

但是我该怎么处理javax.lang.model's VariableElement(它可能代表也可能不代表一个字段)?相应的返回值将是 (我猜) TypeElement

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

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

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

4

2 回答 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必须从 current 获取ProcessingEnvironment,因为它的某些内部依赖于它,因此它不是通常的实用程序类。

于 2010-12-19T16:20:53.010 回答
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 时,你可以做这样的事情来从 TypeMirror 到 TypeElement。

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

我希望这可以帮助别人。

于 2019-02-28T01:41:32.903 回答