2014-09-15 6 views
0

Может кто-нибудь объяснить, почему Application.class.getDeclaredFields() ничего не возвращает?Почему Application.class.getDeclaredFields() ничего не возвращает?

Поле [] fields = Application.class.getDeclaredFields();

Полевой объект пуст после вызова. Существуют ли какие-либо ограничения в java.lang.reflect, чтобы этот вызов не возвращал ничего, кроме нуля?

Спасибо

+0

Как и где вы используете код? Если это заглушка android.jar, с которой вы работаете, она не будет содержать частные поля или публичные поля, аннотированные с помощью '@ hide'. «Приложение» имеет только частные поля и поле «@ hide»-аннотированное. (4.4.4_r1) – laalto

+0

Я пробовал этот код на HTC Wildfire под управлением Android 2.1, а также на Samsung Galaxy Core, работающем на 4.1.2. –

ответ

1

Это не ограничение отражения, но, как ожидается, поведение Reflection API.

getDeclaredFields возвращается .. все поля объявлен .. но исключает наследуемые поля.

getFields возвращает открытые поля из этого класса и всех его суперкласса.

The android.app.Application класса не объявляет сам полей через версии 2.3.7 - то есть, все поля в заявке наследуемые. Как таковой, уместно, что результатом getDeclaredFields в такой среде является пустой массив.

Версия 4.x добавить область (или поля) с пометкой @hide; они должны все еще be accessible via reflection even if not listed in the javadoc/droiddoc output. В этом случае getDeclaredFields должен возвращать соответствующие не наследуемые поля.

+0

Если я использую Class.getFields() вместо этого, я получаю кучу констант (static final some type). Я бы ожидал, что все эти константы с getDeclaredFields() плюс любые оставшиеся частные переменные (при условии, что они существуют), но getDeclaredFields ничего не возвращает. –

+1

Спасибо вам обоим. Я снова запустил код, и метод вернул 3 поля на телефоне под управлением Android 4.1.2. Поля были mLoadedApk, mComponentCallbacks и mActivityLifecycleCallbacks. –

Смежные вопросы