Получить фактический тип вместо параметра типа при обработке аннотации Java 1.6 - PullRequest
2 голосов
/ 08 марта 2011

Учитывая эти два класса

public class MyClass extends MyAbstractClass<Cow> {
  ...
}

public abstract class MyAbstractClass<Foo_ extends AbstractFoo> {
  ...
  Key<Foo_> foo;
  ...
}

Если я запускаю этот код в процессоре аннотаций, я не получаю желаемый результат.

for (VariableElement fieldElement : ElementFilter.fieldsIn(env.getElementUtils().getAllMembers((TypeElement)entityElement))) {
    String fieldType = fieldElement.asType().toString();
}

env - это ProcessingEnvironment.entityElement является Элементом.(MyClass)

fieldType установлен на Key<Foo_>.

Что мне нужно вызвать, чтобы задать для fieldType значение Key<MyClass>?

1 Ответ

2 голосов
/ 01 сентября 2011

Тип foo равен Foo_, как и в коде. Я думаю, что вместо Key<MyClass> вы имеете в виду Key<Cow>, поскольку здесь используется аргумент типа. Используя утилиту Types , вы можете получить тип поля, как видно из подкласса MyClass, используя метод getDeclaredType

// these are the types as declared in the source
System.out.println(fieldElement.asType());      // Key<Foo_>
System.out.println(t.getSuperclass());          // MyAbstractClass<Cow>

// extract the type argument of MyAbstractClass
TypeMirror superClassParameter = ((DeclaredType) t.getSuperclass()).getTypeArguments().get(0);
System.out.println(superClassParameter);        // Cow

// use the type argument and the field's type's type element to construct the fields actual type
DeclaredType fieldType = typeUtils.getDeclaredType(
        (TypeElement) typeUtils.asElement(fieldElement.asType()), superClassParameter);

System.out.println(fieldType);                   // Key<Cow>
...