2014-08-30 144 views
0

最近我編寫了adw-launcher的源代碼,該項目的一些類的一些類使用了android類的protected變量。 下面的代碼片段:訪問Android類的受保護變量

@Override 
    protected boolean setFrame(int left, int top, int right, int bottom) { 
     if (mLeft != left || mRight != right || mTop != top || mBottom != bottom) { 
      mBackgroundSizeChanged = true; 
     } 
     return super.setFrame(left, top, right, bottom); 
    } 

MLEFT,mRight都受到保護。

如何去做這件事? 我完全在這裏白費,需要你的指導。 How do I build the Android SDK with hidden and internal APIs available?

如果我更換新的JAR文件,希望將訪問這些新文件,我將不得不修改這些文件:

我通過這個環節去了?我只是不知道。

感謝

回答

0

您可能需要您自擔風險使用Java的功能強大的(和危險)反射API!

try { 
     Field field = TargetClass.class.getDeclaredField(fieldName); 
     field.setAccessible(true); 

     result = field.get(targetObject); 

     field.setAccessible(false); 
    } catch (IllegalAccessException e) { 
     e.printStackTrace(); 
    } catch (NoSuchFieldException e) { 
     e.printStackTrace(); 
    } 

得到結果爲int

int result = field.getInt(targetObject); 
0

您不能訪問自己的包外protected成員 - 這是在Java的設計。

您可能能夠使用Java反射訪問它,但這不可取。

Field[] f = ClassName.getClass().getDeclaredFields(); 

然後,只需f[i].setAccessible(true)讓你自己讀取它們。但是,除非確實需要,否則這絕對不可取。

+0

但是,他們如何編譯源代碼?對於前者,他們使用了mleft變量來保護視圖。我更新了任務。 – viv 2014-08-30 06:01:21

+0

@viv對不起,我只是不確定你在這裏問什麼。這就是你如何使用反射訪問其他類的受保護變量(儘管這是一種相當危險的方式)。你需要知道什麼? – Zyerah 2014-08-30 06:02:46

+0

上面的代碼片段來自一個擴展TextView仍然eclipse的類,顯示錯誤。 – viv 2014-08-30 09:54:32

0

Android SDK隱藏類僅適用於框架級應用程序/代碼。您需要將framework.jarframework2.jar與您的代碼鏈接以訪問隱藏的API。但是,然後你的應用程序可能會在運行時產生一個Security Exception

正如你提供的鏈接建議你將不得不建立源來獲得這些罐子。那些受保護的變量必須來自基類。如果我正確理解你的問題,那麼基類可能來自框架罐。

+0

你很好地理解我的問題,即使我編譯了這些罐子,變量仍然會被保護,那麼呢? – viv 2014-08-30 07:00:13

+0

受保護的變量只能由子類訪問。您需要從具有這些變量的類繼承。 – 2014-08-30 08:53:30