2016-03-12 31 views
0

,我試圖重寫的CursorLoaderpublic Cursor loadInBackground()方法,所以我在我的應用程序的嘗試:如何在同一個包中但在不同的jar中訪問父類的包本地字段?

package android.content; 

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

但CursorLoader這些‘包本地’字段是不可見的DistinctCursorLoader偶數儘管他們在同一包(雖然顯然不是在同一個JAR)

這是CursorLoader.java(Android的源):

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

你不能簡單的通過做出改變STIC對Android平臺把你自己進入名字空間。您可以在IDE中看到Android平臺組件的源代碼,以方便您瞭解該平臺,而不是訪問其非公共API。

所有類的機器人。*現場設備本身在運行時。它們並未捆綁到應用程序中。因此,首先,您不能保證這些特定字段將會存在,因爲事情可能會在Android版本之間發生變化。其次,該字段可能已被重命名或混淆運送到設備之前,因爲它們不是公共API,並且沒有被應用程序代碼直接訪問期望。

如果你感覺很叛逆,你可以嘗試使用反射在運行時查找和更改隱藏的API,但是這必將導致你在未來的問題。所以不要這樣做。

+0

那麼這個「package-local」訪問權限在java中如何工作呢?根據我看到的文件,應該讓「相同」包中的其他班級看到它們。看起來他們看不到它。我的猜測是因爲他們在另一個罐子裏。 – Gavriel

+0

這不是哪個罐子的問題。這是一個在編譯時完全不可用的問題,因爲這些符號的* only *時間在設備上運行。由於沒有少於10,000個設備在那裏運行某些形式的Android,你怎麼能確定你正在尋找即使是非公共/受保護字段的名稱存在,並鍵入你期待什麼呢?你不能。你不應該這樣做。 –

相關問題