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

时间:2010-12-19 12:01:07

标签: java reflection types mirror annotation-processing

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

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

但我如何处理javax.lang.model的{​​{3}}(可能代表字段也可能不代表字段)?相应的返回值将是(我猜)TypeElement

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

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

BTW,没有一个适合javax.lang.model的Stackoverflow标签;)

2 个答案:

答案 0 :(得分: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,因为它的一些内部因素依赖于它,因此它不是通常的实用程序类。

答案 1 :(得分:0)

我偶然发现了这个试图使新的JDK Doclet毛发变得有意义的方法。接受的答案对我不起作用,因为Doclet具有各种无法使用的内部类。此外,此答案更类似于“如何将TypeMirror转换为TypeElement”。鉴于java.lang.model这样的问题和解答很少,我想还是应该发布此内容。

这就是我所做的:

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);

我希望这对某人有帮助。