在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标签;)
答案 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);
我希望这对某人有帮助。