javax.lang.model:フィールドのタイプを取得するにはどうすればよいですか?
-
11-10-2019 - |
質問
の java.lang.reflect
, 、1つはそうするでしょう:
Field someField = ...;
Class<?> fieldType = someField.getType();
しかし、私は何でしますか javax.lang.model
's VariableElement
(フィールドを表すかもしれないし、そうでないかもしれない)?対応する返品値は(私が推測する) TypeElement
.
VariableElement someField = ...;
TypeElement fieldType = someField.???;
だから、で javax.lang.model
, 、タイプを取得するにはどうすればよいですか(または TypeElement
)field VariableElement
?
ところで、javax.lang.modelに適合するStackoverflowタグは1つもありません。)
解決
まあ、私は知りません、それはこれを行う正しい方法です。
この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には使用できないさまざまな内部クラスがあるため、受け入れられた答えは私にとってはうまくいきませんでした。さらに、この答えは、「タイプミラーをタイプエレメントに変換するにはどうすればよいか」に似ています。 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();
...
}
クラス/インターフェイスの「種類」であるタイプエレメントTがある場合、TypeMirrorからTypeElementに移動するためにこのようなことをすることができます。
TypeMirror p = t.getSuperclass();
TypeElement pe = (TypeElement) typeUtils.asElement(p);
これが誰かを助けることを願っています。