| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java: Общие вопросы > Вопрос по рефлексии в Java |
| Автор: koreyko 7.9.2015, 14:31 | ||||||
| Здравствуйте, стоит задача создать объект класса, известного только на этапе выполнения. Вкратце, надо считать некоторые данные с серверов. ПО на этих серверах может быть разных версий, соответственно у каждой версии свои названия полей данных. Мне надо на этапе выполнения определить версию сервера и подставить в запросе соответствующие имена данных. Я никогда не использовал рефлексию, здесь решил попробовать, т.к. вроде бы она позволяет решить задачу. Сделал базовый класс, пронаследовал дочерние от него с конкретными данными для каждого типа сервера. Получилось что-то типа этого:
Далее в точке вызова я получаю версию сервера и создаю объект соответствующего дочернего класса с помощью рекфлексии:
Теперь мне нужно объект obj привести к типу Server123. Здесь у меня происходит затык или с синтаксисом или с пониманием всего процесса. Вроде бы надо написать как-то так:
Но как правильно синтаксически указать тип Server123 (т.е. то, что в скобках), если он мне не известен на этапе компиляции? Заранее спасибо за помощь! |
| Автор: jManiak 7.9.2015, 14:47 | ||
| А зачем здесь Reflection? Если вы можете получить версию сервера, то пишете что то вроде:
Или вам совсем-совсем неизвестны классы во время компиляции? (Судя по Class.forName("Server"+"123") все же известны) Если совсем неизвестны, тогда да, через Reflection. Но тогда и (Server123) obj тоже не получится. Тут только с полями и методами тоже через Reflection работать. Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/Vopros-po-refleksii-v-Java-id55ed75f0ae20156c0d8b4567#findElement_E7045_55ed793eae20153008863849_0 |
| Автор: koreyko 7.9.2015, 15:08 |
| Спасибо. Я хотел сделать "красивое" решение без if\else. Насчет известности классов во время компиляции, мне неизвестно какой будет конкретно из определенного перечня на этапе выполнения. Грубо говоря, какой именно из Server123, Server456, Server789 и т.д. |
| Автор: jManiak 7.9.2015, 15:36 |
| Ну это у вас значение не известно. Это номрально. Классы то вы все знаете на момент компиляции. В этом случае reflection не нужен. Reflection нужен тогда, когда вы именно КЛАССЫ не знаете на этапе компиляции. Т.е. они готовятся отдельно/позже/другими людьми и подкладываются только при выполнении. А то, что if\else, так это не страшно. Если только там у вас 200 таких if\else, и это повторяется 20 раз по всему коду. Тогда страшно было бы. Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/Vopros-po-refleksii-v-Java-id55ed75f0ae20156c0d8b4567#findElement_E7045_55ed84c5ae2015ea178637cc_0 |
| Автор: koreyko 7.9.2015, 15:53 |
| Понятно, спасибо! |
| Автор: LSD 7.9.2015, 19:19 |
| Desclamer: сильное увлечение энтерпрайзностью порождает трудноподдерживаемых монстров. Но если хочется совсем красиво и "энтерпрайзно", то я бы использовал http://docs.oracle.com/javase/7/docs/api/java/util/ServiceLoader.html. И вместо Server получать ServerFactory которая отдает номер версии, или даже наоборот умеет определять совместим ли сервер с данной версией, что-то типа http://docs.oracle.com/javase/7/docs/api/java/sql/Driver.html#acceptsURL(java.lang.String). Вот это будет полный энтерпрайз. |