Форум программистов, компьютерный форум, киберфорум
Наши страницы

Программирование Android

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 29, средняя оценка - 4.66
elf32
-13 / 8 / 0
Регистрация: 15.02.2013
Сообщений: 87
#1

Что такое Рефлексия? Как быть с deprecated? - Программирование Android

26.02.2013, 16:03. Просмотров 4066. Ответов 30
Метки нет (Все метки)

Предполагаю, рефлексия в данном случае - это когда одним методом получаешь другой метод для использования, динамически. ?
Deprecated - насколько я понимаю, если что-то устарело, то дальнейшая поддержка не гарантированна и оно может быть вообще исключено в дальнейших версиях?
Собственно задача, что делать если метод/класс устарел (deprecated), а нужно чтобы приложение работало на всех версиях?
Нужно как-то на меньшей версии (где гарантированно есть ещё этот deprecated метод/класс) - именно его и использовать, а на большей версии - использовать уже нововведенный аналог.
Наверное, в этом случае и пригодится рефлексия, но опять же, вроде где-то видел, что рефлексия была запрещена на андроиде (наверное от какой-то версии ОС). ?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.02.2013, 16:03
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Что такое Рефлексия? Как быть с deprecated? (Программирование Android):

Deprecated: mysql_connect(): The mysql extension is deprecated and will be removed in the future - Программирование Android
Здравствуйте! Сделал пример http://devcolibri.com/1486 со сборкой денвер сделал все в порядке, работает) дальше решил сделать свою...

Разъясните гуру как такое может быть! - Программирование Android
Купил Навигатор с регистратором. На андроиде. Но андроид какой-то порезаный.нет маркета. нет вообще ничего. только то что установлено....

Что и зачем такое appcompat_v7 - как убрать ? - Программирование Android
День добрый! При создании проекта в Eclipse: Android Application Project создается еще один appcompat_v7 - раньше такова не было, и...

Как правильно начать что бы не быть привязаным к одной технологии/языку? - Программирование
Всем привет. Хочу начать писать под iOS (есть:Macbook Pro, iPhone 5, деньги на аккаунт разработчика) В программировании опыта нет...

Как поступать если метод стал deprecated? - Программирование Android
Доброго дня! Как поступать если метод стал deprecated? Например, getColorStateList() устаревший с 23 api. Что использовать на тех...

Что такое "кэш" в android? Как можно программно сохранить что-то в кэш? - Программирование Android
что такое КЭШ в android? как можно программно сохранить что то в кэш??можете дать ссылку??

30
V0v1k
1159 / 983 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
26.02.2013, 16:08 #2
Рефлексия (от позднелат. reflexio - обращение назад) - это механизм исследования данных о программе во время её выполнения. Рефлексия позволяет исследовать информацию о полях, методах и конструкторах классов. Можно также выполнять операции над полями и методами которые исследуются. Рефлексия в Java осуществляется с помощью Java Reflection API. Этот интерфейс API состоит из классов пакетов java.lang и java.lang.reflect. С помощью интерфейса Java Reflection API можно делать следующее:

Определить класс объекта.
Получить информацию о модификаторах класса, полях, методах, конструкторах и суперклассах.
Выяснить, какие константы и методы принадлежат интерфейсу.
Создать экземпляр класса, имя которого неизвестно до момента выполнения программы.
Получить и установить значение свойства объекта.
Вызвать метод объекта.
Создать новый массив, размер и тип компонентов которого неизвестны до момента выполнения программ.
продолжение - http://www.quizful.net/post/java-reflection-api


Цитата Сообщение от elf32 Посмотреть сообщение
Нужно как-то на меньшей версии (где гарантированно есть ещё этот deprecated метод/класс) - именно его и использовать, а на большей версии - использовать уже нововведенный аналог.
Java
1
2
3
4
5
if(isNewVersion()){
useNewCode();
} else {
useDeprecatedCode();
}
0
elf32
-13 / 8 / 0
Регистрация: 15.02.2013
Сообщений: 87
26.02.2013, 16:30  [ТС] #3
Ну с рефлексией понятно.

А вот if(isNewVersion()) ... else .... не очень.
Веть чтобы выполнить useNewCode нужно импортировать классы заранее, а что будет если импорт классов жестко прописан в коде, при запуске на аппарате в которого этих классов нет?
Так вот например, при использовании J2ME, если вызвать класс в котром импортированы классы которых нет в телефоне - приложение получало краш даже если оно их и не использует. С андроидом ещё не тестировал.
0
V0v1k
1159 / 983 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
26.02.2013, 16:37 #4
что значит вызвать класс?
0
elf32
-13 / 8 / 0
Регистрация: 15.02.2013
Сообщений: 87
26.02.2013, 16:39  [ТС] #5
new MyOtherClass
0
V0v1k
1159 / 983 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
26.02.2013, 16:49 #6
ну, если MyOtherClass присутствует только в новой версии, то строчка new MyOtherClass не должна выполнятся в старой версии, а от импорта ничего не падает, только-что тестил.

Добавлено через 5 минут
потестил еще с new - не падает.
0
elf32
-13 / 8 / 0
Регистрация: 15.02.2013
Сообщений: 87
26.02.2013, 17:12  [ТС] #7
Протестировал. Если импортировать несуществующий класс и дальше его не использовать - никаких проблем (может потому что при сборке он исключается как неиспользуемый!?), но если же вызвать несуществующий метод - краш. Причем краш не именно в месте вызова, а краш ещё до начала выполнения. Даже если использование метода стоит при условии 1==2 всеравно краш Could not find method.
Собственно такое же поведение и на J2ME. Походу решение такое же как и там - создавать для каждой версии отдельный класс в котором и будут использоватся методы именно этой версии.

Добавлено через 4 минуты
А что с рефлексией в андроиде? Запрещена?
0
V0v1k
1159 / 983 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
26.02.2013, 17:39 #8
Цитата Сообщение от elf32 Посмотреть сообщение
Протестировал. Если импортировать несуществующий класс и дальше его не использовать - никаких проблем (может потому что при сборке он исключается как неиспользуемый!?), но если же вызвать несуществующий метод - краш. Причем краш не именно в месте вызова, а краш ещё до начала выполнения. Даже если использование метода стоит при условии 1==2 всеравно краш Could not find method.
Собственно такое же поведение и на J2ME. Походу решение такое же как и там - создавать для каждой версии отдельный класс в котором и будут использоватся методы именно этой версии.
у меня все нормально работает. и именно такой способ как я описал использовали мои коллеги.


Цитата Сообщение от elf32 Посмотреть сообщение
А что с рефлексией в андроиде? Запрещена?
нет.
0
elf32
-13 / 8 / 0
Регистрация: 15.02.2013
Сообщений: 87
26.02.2013, 18:01  [ТС] #9
Что нормально работает? Вызов несуществующего метода?

System.out.println("test main start");
System.out.println("Build.VERSION.SDK_INT: " +Build.VERSION.SDK_INT); //Added in API level 4
И запуск на андроиде 1.5 (API 3) нормально проходит?
0
V0v1k
1159 / 983 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
26.02.2013, 19:46 #10
что под вызовом подразумеваете? выполнение кода или просто запись?

Добавлено через 3 минуты
у меня в if за написан вызов метода с API 15 и использую класс с API 11, запускаю на API 10, креша нет, но и в if не заходит по условию.
0
elf32
-13 / 8 / 0
Регистрация: 15.02.2013
Сообщений: 87
26.02.2013, 20:00  [ТС] #11
Под вызовом я подразумеваю какиой либо доступ к классу, толи new xxxClass() толи static.

Если метод/класс записан в отдельном классе и к нему не обращатся - никаких проблем.
Если же несуществующий метод записан в классе который вызывается - краш.

Да, разобрался уже. Все вопросы решены.
Спасибо!
0
V0v1k
1159 / 983 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
26.02.2013, 20:08 #12
Цитата Сообщение от elf32 Посмотреть сообщение
Если же несуществующий метод записан в классе который вызывается - краш.
значит ваш ваш вызов приводит к вызову несуществующего метода...
0
elf32
-13 / 8 / 0
Регистрация: 15.02.2013
Сообщений: 87
26.02.2013, 20:12  [ТС] #13
НЕ привод. стоит под условием 1==2
0
V0v1k
1159 / 983 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
26.02.2013, 20:15 #14
ну хз, у меня в активити, которое я запускаю, прописаны класы и методы с API 11 и 15 а запускаю я на API 10 и никаких проблем.

Добавлено через 44 секунды
екзепшены должны быть только при попытки исполнения конкретных строк...
0
elf32
-13 / 8 / 0
Регистрация: 15.02.2013
Сообщений: 87
26.02.2013, 20:33  [ТС] #15
так:
есть класс 123class, в нем два метода, один с которых прямо вызывает метод API который не поддерживается.
если в активити написать new 123class() или 123class.любойМетод() - краш. Не обязательно вызывать метод в котором вызывается несуществующий метод.

Добавлено через 2 минуты
нужно разложивать по отдельным классам
0
26.02.2013, 20:33
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.02.2013, 20:33
Привет! Вот еще темы с ответами:

Что такое system_process - Программирование Android
В Android Studio в отладке есть выбор запущенных пакетов + system_process - что это за процесс?

Что такое Jsoup? - Программирование Android
JSOUP это тоже самое что JSON в андроид?? JSOUP чем отличается от JSON??

Что такое Maven? - Программирование Android
В уроке 161 startandroid есть такое замечание для тех, кто хочет протестировать библиотеку Picasso: Подскажите пожалуйста, что это...

Что такое хэширование? - Программирование Android
Можете обьяснить что такое хэширование как это понимать??Я в википедии читал что это преобразование входной строки в массив бит. Так вот...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.