1

Итак, у меня есть набор пакетов, которые являются базовым кодом для расширенных приложений. Мое приложение реализует ряд интерфейсов, которые затем вводятся весной во время выполнения (как настроено). Я хотел бы знать, есть ли способ узнать, какой класс, который реализует интерфейс, был введен. Мне нужно это, потому что у меня есть действия JSON serializer/deserializer, которые я хотел бы выполнить, но для этого мне нужно знать класс, который был введен.Как узнать, какой компонент был введен в интерфейс?

У меня есть файл конфигурации java, который будет описывать проводку, и он будет снабжен реализацией игры. Но пока я не смог получить конкретный класс, реализующий интерфейс. Мне также не удалось запросить эту информацию из контекста.

Мертвые намеки?

+0

Если вы можете получить это, то цель интерфейса потеряна, не так ли? – DNAj

+0

@DNAj Я понимаю вашу точку зрения, но в противном случае я не смог бы обрабатывать преобразование JSON (Jackson), так как я использую POJO, содержащий интерфейс, который должен быть реализован моим приложением. Конечно, здесь есть проблема с дизайном, но я не могу решить, как его решить, не зная внедренного класса. – jfzr

+1

Привет @jfzr, тогда у вас есть возможность только отражения. Используя правильное отражение, вы также можете внести изменения в модификаторы доступа и сделать их доступными. Дайте мне знать, если вам нужна дополнительная информация об этом. – DNAj

ответ

0

Таким образом, я столкнулся с этой проблемой, введя объект в десериализатор JSON и используя метод getClass() в качестве шаблона для использования Джексоном. И это работало как шарм, даже подумал, что внедрение, которое нужно ввести, было введено в проводку, происходящую в зависимости !. Надеюсь, поможет!

2

Вы можете использовать отражение, чтобы инъецируемый экземпляр рассказывал вам, какой класс реализации это: injectedInstance.getClass().getName(). Однако, если вы не делаете что-то особенное, считайте это взломом. Вероятно, вы должны пересмотреть свой дизайн, чтобы вам не нужно было это делать.

+0

Действительно, я думаю, что это будет мое частичное решение, в то время как я решаю этот вопрос дизайна. Благодаря! – jfzr

1

Вы можете просто autowire интерфейса и получить внедренное имя класса:

@Autowired 
private Service service; 

System.out.println(service.getClass().getName()); 

Однако с пружинной фасолью весны контейнер обычно их через прокси-так что это не всегда полезно, в случае выше класса является весной класс под названием:

hello.HelloServiceImpl$$EnhancerBySpringCGLIB$$ad2e225d 

Я подозреваю, что вы должны смотреть на Джексона сериализаторов, который должен обрабатывать все это, см Java - Jackson Annotations to handle no suitable constructor

Смежные вопросы