在java.lang.reflect
,人们可以这样做:
Field someField = ...;
Class<?> fieldType = someField.getType();
但是我如何处理javax.lang.model
的VariableElement
(可能代表或不代表某个领域)?相应的返回值将是(我猜)TypeElement
。
VariableElement someField = ...;
TypeElement fieldType = someField.???;
那么,在javax.lang.model
中,我如何获得由TypeElement
表示的字段的类型(或VariableElement
)?
顺便说一下,没有一个适合javax.lang.model的Stackoverflow标签;)
嗯,我不知道,这是正确的方法。 如果真正理解这个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
获得,因为它的一些内部依赖于它,因此它不是通常的实用类。
我偶然发现了这个试图理解新的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);
我希望这可以帮助别人。