У меня чрезвычайно загадочная ситуация, и я ищу какие-либо идеи.
Я запускаю небольшое приложение Spring MVC, где я использую аннотацию RequestMapping на моем контроллере " AnsController ". Когда RequestDispatcher сканирует мои bean-компоненты для аннотации RequestMapping , в какой-то момент все сводится к следующей строке:
clazz.getAnnotation(RequestMapping.class)
(clazz = AnsController.class)
Строка выше не находит аннотацию, даже если она там есть.
Я начал исследовать это в отладчике Eclipse и обнаружил очень загадочную проблему. Причина, по которой вышеприведенная строка дает сбой, заключается в том, что b / c RequestMapping.class возвращает объект Class, который, по-видимому, описывает правильную аннотацию, но имеет другой внутренний идентификатор и hashCode, чем объект Class, хранящийся в аннотации массив в AnsController.class !
Я написал тестовый сервлет, в который поместил вышеуказанную строку кода, и я вижу, что класс, хранящийся в массиве аннотаций , и класс, возвращаемый RequestMapping.class , тот же объект.
Тем не менее, в RequestDispatcher сервлете, RequestMapping.class , кажется, создает экземпляр другого экземпляра класса для той же самой аннотации (я могу сказать, что внутренний идентификатор намного выше, чем идентификатор объекта Class в карте ().
Другими словами, вызов RequestMapping.class в моем тестовом сервлете приводит к тому, что объект Class отличается от вызова точно такого же кода в RequestDispatcher servlet.
Должно ли это быть даже возможным при условии, что используется один и тот же загрузчик классов? Является ли это достаточным доказательством для заключения о том, что эти разные экземпляры объекта Class, которые должны представлять одну и ту же аннотацию, должны создаваться разными загрузчиками классов?
Я не могу найти в письменной форме ничего, что подтвердило бы мое предположение, что для каждого класса разрешен только один экземпляр объекта Class, но это кажется разумным ... Или я ошибаюсь?