![]() |
Модераторы: LSD, AntonSaburov |
![]() ![]() ![]() |
|
priam220 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 291 Регистрация: 4.6.2010 Репутация: 7 Всего: 8 |
Речь шла о том, что "никак". И я думал, что не правильно понял пример.
Рефлексия влияет как то на скорость обработки кода? |
|||
|
||||
jk1 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1168 Регистрация: 17.10.2008 Где: Санкт-Петербург Репутация: 40 Всего: 75 |
Это и есть "никак". Или вы видите способ это сделать? -------------------- Opinions are like assholes — everybody has one |
|||
|
||||
priam220 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 291 Регистрация: 4.6.2010 Репутация: 7 Всего: 8 |
Ну я не хотел бы вести полемику. Я думал, что речь идет о том, что это в принципе не возможно, а не не возмжно, потому что instanceof можно до утра писать. Это принципиальное различие, возможно, уже не играет роли, для тех, кто знает язык хорошо и имеет приличную практику, но для тех, кто его изучает, это различие важное...
Лучше ответьте, на следующие 2 вопроса: 1. что вы думаете о производительности кода с рефлексией. Есть ли какая то разница вообще. 2. Если говорить о практике, не представляю надобности типизированного Object'om класса. Т.е., конечно, Object'om можно типизировать класс, но обработка все равно ведь будет ограничена какими то типами (). Не предствляю себе класса, который обрабатывает "обсалютно любой" тип. Это что то должно быть сверх абстрактное? |
|||
|
||||
lazycat |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 227 Регистрация: 15.7.2007 Репутация: 1 Всего: 1 |
||||
|
||||
Temdegon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 429 Регистрация: 11.10.2008 Где: Minsk Репутация: 7 Всего: 9 |
Пример, на тему когда может быть нужно обработать "обсалютно любой" тип.
В библиотеке apache.commons.lang есть классы для реализации методов hashCode, equals и toString. Пример использования public String toString() { return ReflectionToStringBuilder.toString(this); } Одна строчка кода, вместо 10 (или 100, смотря сколько полей). Она одна для практически любого Entity и саппортить ее не нужно, даже если вы меняете поля класса. Аналогичные методы есть для hashCode и equals. Писать их вручную и постоянно подправлять мало кому нравится. Удобно? Мне кажется очень даже. |
|||
|
||||
Skipy |
|
||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 487 Регистрация: 24.8.2006 Где: Москва, Россия Репутация: 6 Всего: 16 |
Вы даже в теории не можете перечислить все классы. Просто потому, что я назову класс rerwerw.rtretret.weqwewq.rretre.ytrtyrete.reewrwe.MyClass - а Вы о таком при написании кода и понятия не имели. Кроме того, Ваш код предполагает создание экземпляра, который можно передать в конструктор. А мой код предназначен как раз для того, чтобы избавить вызывающий код от создания экземпляра. Почитайте про шаблон "Factory".
Всё далеко не так плохо. И уже давно. Мы используем reflection очень интенсивно, а проблем с производительностью у нас нет. И не только мы, кстати, Hibernate тоже так работает, например.
Это действительно невозможно в принципе. Просто по тому, что я могу написать параметризованный код - и отдать его в качестве библиотеки. А другой его возьмет - и параметризует СВОИМИ классами. О которых я ничего не знаю, да и знать не могу. А, следовательно, не смогу написать соответствующий instanceof. Кроме того, бесконечное количество instanceof Вы тоже не напишете - размер байткода метода, если мне не изменяет память, ограничен 64К. Это так, к слову.
А Object-ом, как правило, никто и не типизирует. А вот "любым объектом, наследующим Object" довольно часто. Очень в коллекциях полезно в определенных ситуациях. Это сообщение отредактировал(а) Skipy - 15.11.2010, 10:42 |
||||||||
|
|||||||||
priam220 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 291 Регистрация: 4.6.2010 Репутация: 7 Всего: 8 |
Вот инфа по поводу производительнсоти. Кому лень смотреть основное:
метод действительно 64Kb максимум. Нашел баг на эту тему. Это сообщение отредактировал(а) priam220 - 15.11.2010, 16:27 |
|||
|
||||
priam220 |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 291 Регистрация: 4.6.2010 Репутация: 7 Всего: 8 |
Но Factory будет, как полагаю, создаваться для классов из самой библиотеки, а так же их потомков. Следовательно, inctanceof можно сделать только для родительских классов из библиотеки, например (где A - библиотечный супер класс, а B - его потомок переопределенный пользователем):
А засетать пользовательские свойства, в таком случае, мы и с рефлексией не сможем. А если речь идет о том, что бы вернуть дефолтовый Instance, то в моем случае тоже проверок не надо (правда надо будет проверять в вызывающем методе, но мы то знаем какой тип передали), т.е. так работать будет тоже:
Если же мы захотим засетать объект в рефлексивной фабрике, то там тоже будет compile eror:
т.е. на момент создания не известно, что за объект сюда передасться и что за поля у него будут. Так же в моем случае, поскольку объект создается не в статическом методе библиотеки, а в вызываемом, то можно использовать только сетеры фабрики т.е. MyObject obj = new MyObject(); factory.setMyObjectDefault(obj); obj. getValue(); ведь объекты передаются по ссылке. И еще вот: MyFactory <A> mf = new MyFactory <A>(new B()); - можно. MyFactory2 <A> mf = new MyFactory2 <A> (B.class); - нет. Почему? нет ноты "му" ![]() |
||||||
|
|||||||
Skipy |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 487 Регистрация: 24.8.2006 Где: Москва, Россия Репутация: 6 Всего: 16 |
1. Ваши предположения Вам сослужат плохую службу. Когда не оправдаются. Я ПИСАЛ библиотеки, которые создавали классы, ничего не зная об их типах. Например, библиотеку по сериализации в XML. Очень душевно получилось на generic-ах. Сериализует-десериаллизует любые типы, создает классы по имени, и потом - экземпляры. С контролем типов, свойственным generic-ам. Код универсален. 2. Вы себе плохо представляете, что такое "фабрика". У Вас в нее передается уже созданный объект, а внутри ему устанавливается значение. Смысл фабрики - создавать объект внутри. Т.е. типа:
3. Даже если использовать такой вариант. У класса А - 843 наследника (число реальное). Напишите код через instanceof, который будет работать со всеми 843 классами. А я потом послушаю, что Вам скажет тот, кто будет его поддерживать. На этом предлагаю дискуссию закончить. До того момента, когда Вы получите опыт работы с Java хотя бы года три. Тогда у Вас станет меньше предположений и больше знаний о том, что, как и когда рельно делается. Очень надеюсь, что к этому моменту Вы перестанете считать написание даже 100 instanceof возможным. Это сообщение отредактировал(а) Skipy - 16.11.2010, 11:03 |
||||
|
|||||
priam220 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 291 Регистрация: 4.6.2010 Репутация: 7 Всего: 8 |
Skipy, почитал вот тут. Понял, немного, о чем речь.
Полностью согласен. Но суть в том, что это замкнутый круг. Практики не будет, пока не поймешь, хотя бы в общем, что это. А не поймешь это, пока не будет практики. Поэтому, в любом случае, вначале надо разобраться просто с тем, хотябы как это работает и где. И Вы мне с этим помогли. За что БОЛЬШОЕ СПАСИБО. Мои прения прошу не воспринимать в серьез, это просто попытка разместить рефлексию в сознании там, где она должна быть. Еще раз спасибо. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Java" | |
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |