質問

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

これが誰かを助けることを願っています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top