2016-03-12 4 views
0

И я пытаюсь переопределить public Cursor loadInBackground() метод CursorLoader «с, так что я пытался в моем приложении:Как я могу получить доступ к локальным полям пакета родительского класса в одном пакете, но в разных банках?

package android.content; 

public class DistinctCursorLoader extends CursorLoader { 
    @Override 
    public Cursor loadInBackground() { 
     // I need to use mUri, mProjection, mSelection, mSortOrder 

Но эти„пакет-местный“полей CursorLoader не видны DistinctCursorLoader даже, хотя они находятся в такой же пакет (хотя, очевидно, не в том же банке)

Это из CursorLoader.java (источник андроида):

package android.content; 

public class CursorLoader extends AsyncTaskLoader<Cursor> { 
    Uri mUri; 
    String[] mProjection; 
    String mSelection; 
    String[] mSelectionArgs; 
    String mSortOrder; 
+1

Загружаются ли они другим загрузчиком классов? –

+0

Я не делаю ничего, чтобы загрузить их по-другому, но я не знаю, как это работает в Android. Однако стоит отметить, что даже в AndroidStudio он уже жалуется на эти поля, это не проблема времени выполнения. – Gavriel

ответ

1

Вы не можете просто внести изменения в Android платформы от ЦНТИ король себя в свое пространство имен. Исходный код, который вы видите для компонентов платформы Android в среде IDE, предоставлен в качестве удобства для вас, чтобы узнать о платформе, а не обращаться к его непубличным API.

Все классы в android. * Живут на самом устройстве во время работы. Они не включены в приложение. Итак, прежде всего, у вас нет гарантии, что эти конкретные поля будут существовать, поскольку все может измениться между версиями Android. Во-вторых, поля, возможно, были переименованы или запутаны перед отправкой на устройство, потому что они не являются общедоступным API и не имеют ожидаемого прямого доступа к коду приложения.

Если вы чувствуете себя очень мятежным, вы можете попытаться использовать отражение во время выполнения, чтобы найти и внести изменения в скрытые API, но это наверняка вызовет у вас проблемы в будущем. Так что не делай этого.

+0

Итак, как это разрешение доступа к «локальному пакету» работает в java? Согласно документам, я видел, что это должно позволить другим классам в «том же» пакете видеть их. Похоже, они этого не видят. Думаю, это потому, что они в другой банке. – Gavriel

+0

Это не вопрос баночки. Речь идет о том, что во время компиляции полностью недоступна, потому что время * только *, которое имеет значение символов, находится во время выполнения на устройстве. Учитывая, что существует не менее 10 000 устройств, работающих под управлением какой-либо формы Android, как вы можете быть уверены, что непубличное/защищенное поле, которое вы ищете, даже существует с именем и типом, который вы ожидаете? Вы не можете. И вы не должны. –