Считается ли это отражением и в какой степени? - PullRequest
6 голосов
/ 07 января 2010

У меня есть приложение Android (java), которое работало нормально при компиляции с Android 1.6 SDK, используя следующий код из класса android.provider.Contacts:

Uri baseUri = Contacts.Phones.CONTENT_FILTER_URL;

Когда вышел 2.0 SDK, класс android.provider.Contacts был устарел и заменен на android.provider.ContactsContract. Чтобы заставить одну программу работать как на 1.6, так и на 2.0, я собрал версию 1.6 со следующим изменением:

Uri baseUri = Contacts.Phones.CONTENT_FILTER_URL;
…
try {
    Class<?> c = Class.forName("android.provider.ContactsContract$PhoneLookup");
    baseUri = (Uri) c.getField("CONTENT_FILTER_URI").get(baseUri);
} 
    catch (Exception e) {           
}

Поскольку я компилировал под 1.6, я не мог импортировать android.provider.ContactsContract, так как это класс, известный только для 2.0. Считается ли это отражением и в какой степени?

Добавлен комментарий: После прочтения главы «Отражение» в «Языке программирования Java» (что я должен был сделать в первую очередь), я теперь в основном понимаю, что вы можете сделать с помощью отражения, но краткое определение отражение не легко найти. Ваши ответы помогли прояснить, что вызвало мой вопрос - что после того, как класс был отражен, и экземпляр класса создан с использованием отражения, вы можете взаимодействовать с экземпляром, как если бы класс был новым.

Вот моя скудная попытка получить краткое определение, которое далеко от совершенства, и я уверен, что мне нужно будет пересмотреть, когда я узнаю больше:

Отражение - это косвенный, динамический запрос, манипулирование или вызов объектов класса с использованием объектов класса, содержащихся в java.lang.reflect, или классов Class или Package, которые требуют первоначального доступа к классу с использованием полного имени строки.

Ответы [ 4 ]

6 голосов
/ 07 января 2010

Я полагаю, что это и есть определение Java-отражения ( больше об Android-отражениях для совместимости с несколькими версиями ). Я не уверен, что вы подразумеваете под "до какой степени"; это просто так.

4 голосов
/ 07 января 2010

Динамически запрашивать доступность метода - это форма отражения, да.

1 голос
/ 08 января 2010

Это очень хорошая статья о стратегиях, рефлексии и других более сложных вещах, для использования новых API, оставаясь совместимой со старыми платформами:

http://android -developers.blogspot.com / 2009/04 / обратная совместимость для-android.html

1 голос
/ 07 января 2010

Это отражение.

Если CONTENT_FILTER_URI является окончательным статическим полем, тогда вы должны использовать get(null) вместо get(baseUri), потому что вы не вызываете объект.

Редактировать

Я был немного смущен вашим кодом. Как я понимаю ваш фрагмент, сначала вы присваиваете Contacts.Phones.CONTENT_FILTER_URL для URL baseUri, затем вы отражаете поле CONTENT_FILTER_URI в классе PhoneLookup и считываете значение этого поля из экземпляра URL, хранящегося в baseUri - просто присвоить значение baseUri снова!? Опечатка или комната для улучшения?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...