In java.lang.reflect
, one would do:
Field someField = ...;
Class<?> fieldType = someField.getType();
But what do I do with javax.lang.model
's VariableElement
(which may or may not represent a field)? A corresponding return value would be (I guess) TypeElement
.
VariableElement someField = ...;
TypeElement fieldType = someField.???;
So, in javax.lang.model
, how do I get the type (or TypeElement
) of a field, represented by VariableElement
?
BTW, there is not a single Stackoverflow-tag which would fit to javax.lang.model ;)
Well, I don't know, it that's the right way to do this.
Would be nice if someone, who actually understands this API, told me.
But well, seams to work.
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;
}
}
It seems that the class Types
has to be got from current ProcessingEnvironment
because some of its internals depend on it, so it's not a usual utility class.
I stumbled across this trying to make sense out of the new JDK Doclet hairball. The accepted answer didn't work for me because, well, Doclet has various internal classes that cannot be used. Furthermore, this answer is more akin to "how do I convert TypeMirror to TypeElement"; given the paucity of java.lang.model SO questions+answers, I thought I'd post this anyway.
Here's what I did:
import javax.lang.model.util.Elements;
import javax.lang.model.util.Types;
@Override
public boolean run(DocletEnvironment docEnv) {
...
elementUtils = docEnv.getElementUtils();
typeUtils = docEnv.getTypeUtils();
...
}
When you have a TypeElement t that is a class/interface "kind" you can do something like this to go from TypeMirror to TypeElement.
TypeMirror p = t.getSuperclass();
TypeElement pe = (TypeElement) typeUtils.asElement(p);
I hope this helps someone.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With