Форум программистов, компьютерный форум CyberForum.ru

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

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

Что такое Рефлексия? Как быть с deprecated? - Android

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

Предполагаю, рефлексия в данном случае - это когда одним методом получаешь другой метод для использования, динамически. ?
Deprecated - насколько я понимаю, если что-то устарело, то дальнейшая поддержка не гарантированна и оно может быть вообще исключено в дальнейших версиях?
Собственно задача, что делать если метод/класс устарел (deprecated), а нужно чтобы приложение работало на всех версиях?
Нужно как-то на меньшей версии (где гарантированно есть ещё этот deprecated метод/класс) - именно его и использовать, а на большей версии - использовать уже нововведенный аналог.
Наверное, в этом случае и пригодится рефлексия, но опять же, вроде где-то видел, что рефлексия была запрещена на андроиде (наверное от какой-то версии ОС). ?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
26.02.2013, 16:08     Что такое Рефлексия? Как быть с deprecated? #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();
}
elf32
-13 / 8 / 0
Регистрация: 15.02.2013
Сообщений: 87
26.02.2013, 16:30  [ТС]     Что такое Рефлексия? Как быть с deprecated? #3
Ну с рефлексией понятно.

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

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

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


Цитата Сообщение от elf32 Посмотреть сообщение
А что с рефлексией в андроиде? Запрещена?
нет.
elf32
-13 / 8 / 0
Регистрация: 15.02.2013
Сообщений: 87
26.02.2013, 18:01  [ТС]     Что такое Рефлексия? Как быть с deprecated? #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) нормально проходит?
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
26.02.2013, 19:46     Что такое Рефлексия? Как быть с deprecated? #10
что под вызовом подразумеваете? выполнение кода или просто запись?

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

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

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

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

Добавлено через 2 минуты
нужно разложивать по отдельным классам
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
26.02.2013, 20:46     Что такое Рефлексия? Как быть с deprecated? #16
у меня такой проблемы не наблюдается. выложите проект.
elf32
-13 / 8 / 0
Регистрация: 15.02.2013
Сообщений: 87
26.02.2013, 22:12  [ТС]     Что такое Рефлексия? Как быть с deprecated? #17
Java
1
2
3
4
5
6
7
8
final class testCrash{
    
    public static String str = "testCrash created";
    
    public static void crash(){
        System.out.println("Build.VERSION.SDK_INT: " +Build.VERSION.SDK_INT); //API4
    }
}
В MainActivity:
System.out.println("main start");
System.out.println("testCrash.str: " +testCrash.str);

Запускаем на андроиде меньше API4 и получаем краш, хоть и к testCrash.crash() не обращались!
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
27.02.2013, 00:12     Что такое Рефлексия? Как быть с deprecated? #18
где же такой древний андроид взять?) (эмулятор не перевариваю)
elf32
-13 / 8 / 0
Регистрация: 15.02.2013
Сообщений: 87
27.02.2013, 00:40  [ТС]     Что такое Рефлексия? Как быть с deprecated? #19
так вот эмулятор для таких целей и нужен.
Видимо в это и суть, на более младших андроидах краши есть, а выше нет.
Так вот если заменить на какой-то метод введенный в API17 и запустить пример на API16 то краша не будет, пока не обратимся прямо к testCrash.crash(), ну а на том же API3 - в любом случае краш.

Хоть андроид то и древний, но всё же используется ещё. Вот только что промониторил логи своего веб сервера - есть андроиды и 1.5 и 1.6.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.02.2013, 00:47     Что такое Рефлексия? Как быть с deprecated?
Еще ссылки по теме:

Android Что такое setWakeMode
Android Как поступать если метод стал deprecated?
Что такое system_process Android
Android Что такое Maven?
Android Что такое хэширование?

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

Или воспользуйтесь поиском по форуму:
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
27.02.2013, 00:47     Что такое Рефлексия? Как быть с deprecated? #20
как уже писал, на API10 писал методы с API15, крешей не было.

Добавлено через 22 секунды
а эмулятору я никогда не доверял.

Добавлено через 1 минуту
http://habrastorage.org/storage2/2bb...3a71b32e89.png
Yandex
Объявления
27.02.2013, 00:47     Что такое Рефлексия? Как быть с deprecated?
Ответ Создать тему
Опции темы

Текущее время: 15:17. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru