У меня есть вопрос по поводу Reflection, но мотивация заключается в использовании Spring Framework.
Рассмотрим этот проект, который является своего рода версией Минимального рабочего примера развернутого проекта.
В классе ProjectionResourceProcessorConfig
у меня есть метод entityProjectionResourceProcessor
для каждого прогноза, и у каждого объекта в базе данных есть несколько прогнозов. Это около 60 методов.
Я не хочу продолжать это из-за очевидного недостатка в обслуживании. Я хочу использовать Reflection для автоматической регистрации одного компонента для каждого класса проекции.
Метод postProcessBeanDefinitionRegistry
в классе ProjectionResourceProcessorConfig
показывает, что я могу получить список классов, которые я хочу использовать для регистрации одногоbean для каждого и показывает, как программно зарегистрировать bean.
Однако, поскольку мне нужно использовать класс ProjectionResourceProcessor
, мне нужно переопределить метод getEntityClass
. Я не смог найти способ сделать это программно. Вот почему я объявил внутренний класс. Он показывает работающую регистрацию программных бинов, но он падает по той же причине, что и фрагмент кода для каждого бина.
Помимо отражения, я попытался использовать метод setMethodOverrides
класса RootBeanDefinition
переопределить этот метод, но я не смог понять, как использовать этот метод. Google не смог найти какую-либо документацию или пример использования (за исключением смутно связанной публикации на китайском языке с копиями на нескольких разных веб-сайтах).
Я также пытался использовать класс MethodReplacer
, но не нашел, какиспользуйте его с конфигурацией, управляемой аннотациями.
Я также пытался заменить метод getEntityClass
на переменную и заменить ее значение отражением, но, очевидно, когда переменная считывает значение, установленное в суперклассеэто тот, который извлекается.
Чтобы протестировать проект, запустите тесты на DemoApplicationTests
. Он напечатает проекцию некоторых объектов. Если у них есть ссылки, это работает.
Можно ли делать то, что я хочу? Если да, то как?
Заранее спасибо.