Как получить доступ к аннотациям типа для параметров типа приемника

Я рассматриваю довольно тривиальный класс с единственным методом, который определяет тип аннотированного приемника:

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, как вы хотите.

Я знаю, что это только часть ответа прямо сейчас... но я хотел что-то начать. Другие могут добавить и предоставить полный ответ, или я узнаю немного больше по мере того, как время проходит... Типы приемников и такое использование аннотаций для меня все очень новы, и не хватает документации и образцов, которые можно пройти.

Мое подозрение в том, что доступ к этой информации просто отсутствует. См. Также ответ на другой вопрос:

Что касается комментариев, то о получении аннотации из аргумента типа в параметре метода, нет способа, указанного выше.

В том же разделе будет показано, как получить доступ к аннотациям в аргументах типа в поле.