javax.lang.model: Как я могу получить тип поля? - PullRequest
13 голосов
/ 19 декабря 2010

В java.lang.reflect можно сделать:

Field someField = ...;
Class<?> fieldType = someField.getType();

Но что мне делать с javax.lang.model VariableElement (который может представлять или не представлять поле)? Соответствующее возвращаемое значение будет (я думаю) TypeElement.

VariableElement someField = ...;
TypeElement fieldType = someField.???;

Итак, в javax.lang.model как я могу получить тип (или TypeElement) поля, представленного VariableElement?

Кстати, нет ни одного Stackoverflow-тега, который бы подходил javax.lang.model;)

Ответы [ 2 ]

7 голосов
/ 19 декабря 2010

Ну, я не знаю, это правильный способ сделать это.
Было бы неплохо, если бы кто-то, кто действительно понимает этот 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, потому что некоторые его внутренние компоненты зависят от него, так что это не обычный служебный класс.

0 голосов
/ 28 февраля 2019

Я наткнулся на это, пытаясь понять смысл нового шарика для волос JDK 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,это класс / интерфейс "kind", вы можете сделать что-то подобное, чтобы перейти от TypeMirror к TypeElement.

TypeMirror   p = t.getSuperclass();
TypeElement pe = (TypeElement) typeUtils.asElement(p);

Надеюсь, это кому-нибудь поможет.

...