Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Рефлексия и интерфейсы 
:(
    Опции темы
priam220
Дата 14.11.2010, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 4.6.2010

Репутация: 7
Всего: 8



Речь шла о том, что "никак". И я думал, что не правильно понял пример. 
Рефлексия влияет как то на скорость обработки кода?
PM MAIL   Вверх
jk1
Дата 14.11.2010, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1168
Регистрация: 17.10.2008
Где: Санкт-Петербург

Репутация: 40
Всего: 75



Цитата

 А вот если предполагается параметризация абсолютно любым классом, тут if'ов не напасешься.

Это и есть "никак". Или вы видите способ это сделать?


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
priam220
Дата 14.11.2010, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 4.6.2010

Репутация: 7
Всего: 8



Ну я не хотел бы вести полемику. Я думал, что речь идет о том, что это в принципе не возможно, а не не возмжно, потому что instanceof можно до утра писать. Это принципиальное различие, возможно, уже не играет роли, для тех, кто знает язык хорошо и имеет приличную практику, но для тех, кто его изучает, это различие важное...
 Лучше ответьте, на следующие 2 вопроса:
1. что вы думаете о производительности кода с рефлексией. Есть ли какая то разница вообще.
2. Если говорить о практике, не представляю надобности типизированного Object'om класса. Т.е., конечно, Object'om можно типизировать класс, но обработка все равно ведь будет ограничена какими то типами (). Не предствляю себе класса, который обрабатывает "обсалютно любой" тип. Это что то должно быть сверх абстрактное?
PM MAIL   Вверх
lazycat
Дата 14.11.2010, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 227
Регистрация: 15.7.2007

Репутация: 1
Всего: 1



Цитата(priam220 @  14.11.2010,  11:20 Найти цитируемый пост)
Рефлексия влияет как то на скорость обработки кода? 


Еще как влияет! Если не изменяет память, в сотни раз замедляет. Так что, если задачу можно решить без рефлексии и скорость критична, то от рефлексии лучше отказаться.

PM MAIL   Вверх
Temdegon
Дата 15.11.2010, 05:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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. Писать их вручную и постоянно подправлять мало кому нравится. 
Удобно? Мне кажется очень даже.


PM MAIL   Вверх
Skipy
Дата 15.11.2010, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 487
Регистрация: 24.8.2006
Где: Москва, Россия

Репутация: 6
Всего: 16



Цитата(priam220 @ 14.11.2010,  11:20)
Речь шла о том, что "никак". И я думал, что не правильно понял пример. 

Вы даже в теории не можете перечислить все классы. Просто потому, что я назову класс rerwerw.rtretret.weqwewq.rretre.ytrtyrete.reewrwe.MyClass - а Вы о таком при написании кода и понятия не имели.

Кроме того, Ваш код предполагает создание экземпляра, который можно передать в конструктор. А мой код предназначен как раз для того, чтобы избавить вызывающий код от создания экземпляра. Почитайте про шаблон "Factory".

Цитата(lazycat @ 14.11.2010,  20:18)
Цитата(priam220 @  14.11.2010,  11:20 Найти цитируемый пост)
Рефлексия влияет как то на скорость обработки кода? 


Еще как влияет! Если не изменяет память, в сотни раз замедляет.

Всё далеко не так плохо. И уже давно. Мы используем reflection очень интенсивно, а проблем с производительностью у нас нет. И не только мы, кстати, Hibernate тоже так работает, например.

Цитата(priam220 @ 14.11.2010,  18:52)
Ну я не хотел бы вести полемику. Я думал, что речь идет о том, что это в принципе не возможно, а не не возмжно, потому что instanceof можно до утра писать. Это принципиальное различие, возможно, уже не играет роли, для тех, кто знает язык хорошо и имеет приличную практику, но для тех, кто его изучает, это различие важное...

Это действительно невозможно в принципе. Просто по тому, что я могу написать параметризованный код - и отдать его в качестве библиотеки. А другой его возьмет - и параметризует СВОИМИ классами. О которых я ничего не знаю, да и знать не могу. А, следовательно, не смогу написать соответствующий instanceof.

Кроме того, бесконечное количество instanceof Вы тоже не напишете - размер байткода метода, если мне не изменяет память, ограничен 64К. Это так, к слову.

Цитата(priam220 @ 14.11.2010,  18:52)
2. Если говорить о практике, не представляю надобности типизированного Object'om класса. Т.е., конечно, Object'om можно типизировать класс, но обработка все равно ведь будет ограничена какими то типами (). Не предствляю себе класса, который обрабатывает "обсалютно любой" тип. Это что то должно быть сверх абстрактное?

А Object-ом, как правило, никто и не типизирует. А вот "любым объектом, наследующим Object" довольно часто. Очень в коллекциях полезно в определенных ситуациях. 

Это сообщение отредактировал(а) Skipy - 15.11.2010, 10:42


--------------------
С уважением,
Евгений aka Skipy
www.skipy.ru
PM MAIL WWW ICQ   Вверх
priam220
Дата 15.11.2010, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 4.6.2010

Репутация: 7
Всего: 8



Вот инфа по поводу производительнсоти. Кому лень смотреть основное:

Цитата

 And when running under JDK 1.6.0:

Took 39 ms for 500000 x Reflection construct (x = 3)
Took 19 ms for 500000 x Direct construct (x = 5)
   
Took 61 ms for 2000000 x Reflection call set (x = -1)
Took 391 ms for 2000000 x Reflection assign set (x = 6)
Took 1 ms for 2000000 x Method set (x = 0)
   
Took 65 ms for 2000000 x Reflection call get (x = -1)
Took 201 ms for 2000000 x Reflection access get (x = -1)
Took 0 ms for 2000000 x Method get (x = -1)

With the disclaimers stated above (wrt. accuracy of ratios), it appears that using Reflection is about two orders of magnitude (~100 times) slower, when comparing calling a setter method; and about three orders of magnitude (~1000 times) if Reflection field accessor is used. 


метод действительно 64Kb максимум. Нашел баг на эту тему.

Это сообщение отредактировал(а) priam220 - 15.11.2010, 16:27
PM MAIL   Вверх
priam220
Дата 15.11.2010, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 4.6.2010

Репутация: 7
Всего: 8



Цитата(Skipy @  15.11.2010,  10:30 Найти цитируемый пост)
Это действительно невозможно в принципе. Просто по тому, что я могу написать параметризованный код - и отдать его в качестве библиотеки. А другой его возьмет - и параметризует СВОИМИ классами. О которых я ничего не знаю, да и знать не могу. А, следовательно, не смогу написать соответствующий instanceof.

Но Factory будет, как полагаю, создаваться для классов из самой библиотеки, а так же их потомков. Следовательно, inctanceof можно сделать только для родительских классов из библиотеки, например (где A - библиотечный супер класс, а B - его потомок переопределенный пользователем):
Код

package default_pack;

public class MyClass {
    public static void main (String[] args){
        MyFactory <A> mf = new MyFactory <A>(new B());
        System.out.println(((B)mf.createObjInstance()).a);
    }
}


class MyFactory<T>{
    private T obj;
    public MyFactory(T obj){
        this.obj = obj;
    }
   
    public Object createObjInstance(){
     if (obj instanceof A)
     {
      ((A)obj).a =10;
      return obj;     
     }    
     throw new RuntimeException("Not acceptable type");
    }
}

class A{
    public int  a; 
}

class B extends A{
    public B(){}
}


А засетать пользовательские свойства, в таком случае, мы и с рефлексией не сможем. А если речь идет о том, что бы вернуть дефолтовый Instance, то в моем случае тоже проверок не надо (правда надо будет проверять в вызывающем методе, но мы то знаем какой тип передали), т.е. так работать будет тоже:
Код

    public Object createObjInstance(){
     //if (obj instanceof A)
     //{
     // ((A)obj).a =10;
      return obj;     
     //}    
     //throw new RuntimeException("Not acceptable type");
    }


Если же мы захотим засетать объект в рефлексивной фабрике, то там тоже будет compile eror:
Код

    public T createObjInstance() throws Exception{
            T myInst = clazz.newInstance();
            //myInst.a = 10;
            return myInst;    
    }

т.е. на момент создания не известно, что за объект сюда передасться и что за поля у него будут. 


Так же в моем случае, поскольку объект создается не в статическом методе библиотеки, а в вызываемом, то можно использовать только сетеры фабрики т.е. 
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); - нет.
Почему?
нет ноты "му"    smile 

PM MAIL   Вверх
Skipy
Дата 16.11.2010, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 487
Регистрация: 24.8.2006
Где: Москва, Россия

Репутация: 6
Всего: 16



Цитата(priam220 @ 15.11.2010,  17:08)
Но Factory будет, как полагаю, создаваться для классов из самой библиотеки, а так же их потомков. Следовательно, inctanceof можно сделать только для родительских классов из библиотеки, например (где A - библиотечный супер класс, а B - его потомок переопределенный пользователем):

1. Ваши предположения Вам сослужат плохую службу. Когда не оправдаются. Я ПИСАЛ библиотеки, которые создавали классы, ничего не зная об их типах. Например, библиотеку по сериализации в XML. Очень душевно получилось на generic-ах. Сериализует-десериаллизует любые типы, создает классы по имени, и потом - экземпляры. С контролем типов, свойственным generic-ам. Код универсален.

2. Вы себе плохо представляете, что такое "фабрика". У Вас в нее передается уже созданный объект, а внутри ему устанавливается значение. Смысл фабрики - создавать объект внутри. Т.е. типа:

Код
if (obj instanceof A){return new A();} else
if (obj instanceof B){return new B();} else
if (obj instanceof C){return new C();} else
if (obj instanceof D){return new D();} else
...


3. Даже если использовать такой вариант. У класса А - 843 наследника (число реальное). Напишите код через instanceof, который будет работать со всеми 843 классами. А я потом послушаю, что Вам скажет тот, кто будет его поддерживать.

На этом предлагаю дискуссию закончить. До того момента, когда Вы получите опыт работы с Java хотя бы года три. Тогда у Вас станет меньше предположений и больше знаний о том, что, как и когда рельно делается. Очень надеюсь, что к этому моменту Вы перестанете считать написание даже 100 instanceof возможным.

Это сообщение отредактировал(а) Skipy - 16.11.2010, 11:03


--------------------
С уважением,
Евгений aka Skipy
www.skipy.ru
PM MAIL WWW ICQ   Вверх
priam220
Дата 16.11.2010, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 4.6.2010

Репутация: 7
Всего: 8



Skipy,  почитал вот тут. Понял, немного, о чем речь.
Цитата

До того момента, когда Вы получите опыт работы с Java хотя бы года три.


Полностью согласен. Но суть в том, что это замкнутый круг. Практики не будет, пока не поймешь, хотя бы в общем, что это. А не поймешь это, пока не будет практики. Поэтому, в любом случае, вначале надо разобраться просто с тем, хотябы как это работает и где. 

И Вы мне с этим помогли. За что БОЛЬШОЕ СПАСИБО. Мои прения прошу не воспринимать в серьез, это просто попытка разместить рефлексию в сознании там, где она должна быть.
Еще раз спасибо. 



PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0847 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.