Как получить доступ к аннотациям типа для параметров типа приемника
Я рассматриваю довольно тривиальный класс с единственным методом, который определяет тип аннотированного приемника:
class Foo<T> {
void foo(Foo<@Bar T> this) {}
}
Теперь я хотел бы получить доступ к аннотации типа в параметре типа приемника @Bar
, но API отражения Java возвращает аннотированный необработанный тип при обращении к получателю:
assert Foo.class.getDeclaredMethod("foo")
.getAnnotatedReceiverType()
instanceof AnnotatedParameterizedType;
Утверждение терпит неудачу, поскольку возвращаемый аннотированный тип возвращается как необработанный тип Foo
. Это намеренно? Я все еще могу найти аннотацию @Bar
при обращении к закрытым свойствам реализации AnnotatedType
, которые возвращаются.
Я запускаю последнюю версию Java 8.
Ответы
Ответ 1
Оказывается, это простая ошибка. Сначала я подумал, что это подразумевает связанные проблемы, но аннотации типа не имеют к этому никакого отношения. Аннотации типа плохо тестируются в текущей реализации среды выполнения Java. Я обнаружил огромное количество проблем при глубоком погружении в дело:
Ответ 2
Это известная ошибка JDK-8058220. Однако проблема глубже, что может показаться.
Он не может быть легко исправлен без изменений в формате файла классов и соответствующих обновлений спецификаций. В настоящее время файл класса не содержит информации, требуемой для различения параметра приемника от обычного (см. JDK-8062582).
Ответ 3
Если я запустил это:
Foo<Integer> f = new Foo<>();
Method m = f.getClass().getDeclaredMethod("foo");
AnnotatedType at = m.getAnnotatedReceiverType();
for (Annotation a:at.getAnnotations()) {
System.out.println("Annotation: "+a);
}
Затем я помещаю аннотацию в тип приемника следующим образом:
public void foo(@Bar(1) Foo<T> this) {}
Теперь вы можете получить доступ к аннотации @Bar (1). Обратите внимание, что я помещаю аннотацию непосредственно на ReceiverParameter, а не в параметр Param Parameter, как вы хотите.
Я знаю, что это только часть ответа прямо сейчас... но я хотел что-то начать. Другие могут добавить и предоставить полный ответ, или я узнаю немного больше по мере того, как время проходит... Типы приемников и такое использование аннотаций для меня все очень новы, и не хватает документации и образцов, которые можно пройти.
Мое подозрение в том, что доступ к этой информации просто отсутствует. См. Также ответ на другой вопрос:
Что касается комментариев, то о получении аннотации из аргумента типа в параметре метода, нет способа, указанного выше.
В том же разделе будет показано, как получить доступ к аннотациям в аргументах типа в поле.