У меня есть интерфейс вроде этого:Как получить квалифицированное имя класса родового типа в обработке аннотаций?
interface MyInterface<V>{
}
и все мои аннотированных классов с @MyAnnotation
реализовать этот интерфейс по-разному, например.
//first way
Class1 implement MyInterface<SomeClass>
//second way
AbstractClass<V> implement MyInterface<V>
Class2 extends AbstractClass<SomeClass>
//third way
ConcreteClass implement MyInterface<SomeClass>
Class3 extends ConcreteClass
Ну, у меня есть TypeElement
S класса 1,2 и 3, и я хочу, чтобы найти полное имя типа переменной V
.
Я попробовал это, но он возвращает V
вместо SomeClass
.
TypeElement class1 = ...
while(reachToMyInterface){
for (TypeMirror m : ((DeclaredType) class1.asType()).getTypeArguments()) {
print(m.toString()) // prints V
}
class1 = getItsSuperClass();
}
Edit: Кроме того, этот подход имеет те же проблемы:
for (Element element : roundEnv.getElementsAnnotatedWith(Haha.class)) {
if (element instanceof TypeElement) {
TypeElement te = (TypeElement) element;
TypeElement currentType = te;
while(currentType!=null){
for (TypeMirror typeMirror : currentType .getInterfaces()) {
if (typeMirror instanceof DeclaredType) {
DeclaredType dclt = (DeclaredType) typeMirror;
for (TypeMirror argument : dclt.getTypeArguments()) {
print(argument);
}
}
}
currentType = getSuperClass(currentType);
}
}
private TypeElement getSuperClass(TypeElement typeElement) {
if (!(typeElement.getSuperclass() instanceof DeclaredType)) return null;
DeclaredType declaredAncestor = (DeclaredType) typeElement.getSuperclass();
return (TypeElement) declaredAncestor.asElement();
}
@JornVernee если 'MyInterface' имеет метод' void foo (V bar) ', то можно ли получить' MyClass'? Я все еще путаюсь со вторым способом, потому что возможно, что Class2 не переопределяет 'foo' –
@ Обработка событий annornation @JornVernee происходит во время компиляции, а не во время выполнения. И ваше утверждение также неверно для времени выполнения. Типы экземпляров стираются, но ограничения типов в классах, методах и полях сохраняются. Запрос этой информации - очень продвинутый предмет. Это обсуждается здесь: https://github.com/google/guava/wiki/ReflectionExplained#typetoken –