說說android中的hide annotation

來源:互聯網
上載者:User

今天在公司一個同事突然問我一個關於android提供的SDK源碼中public對應的field無法訪問的問題,我仔細的檢查了一下相關的代碼,沒有發現代碼有任何的問題,但是在調用該class對應的filed的時候卻始終都報錯,源碼如下:

public static final class Email implements DataColumnsWithJoins, CommonColumns

            /**             * The email address.             * <P>Type: TEXT</P>             * @hide TODO: Unhide in a separate CL             */            public static final String ADDRESS = DATA1;

從以上代碼可以看到Email這個類中有一個public的static field叫做ADDRESS,但是根據Email.ADDRESS訪問一直提示找不到field。這個現象讓我覺得非常的好奇,仔細的google了一下,發現原因就在於@hide這個annotation上面。

在android的SDK中有兩類的API是無法直接存取的,一類是com.android.internal包下面的類,可以稱之為internal API。另外一類就是通過hide這個annotation所標註的class,method或者field,可以稱作hide api。(可惜沒有在SDK中找到關於hide這個annotation的源碼)

根據網上的資訊,把internal封裝的源碼和通過hide annotation標註的代碼進行一個小小的對比,原文來自http://devmaze.wordpress.com/2011/01/18/using-com-android-internal-part-1-introduction/

Hidden API之所以被隱藏,是想阻止開發人員使用SDK中那些未完成或不穩定的部分(介面或架構)。舉個例子,Bluetooth API在API 5(Android 2.0)上才開放;在API 3 和4上都是用@hide屬性隱藏了。當這些API被驗證和清理後,Google的開發人員會移除@hide屬性,並讓其在API 5官方化。很多地方在API 4 和5之間發生了變化。如果你的程式依賴某些隱藏的API,當其部署到新的平台上時,就有可能陷入困境。

對於internal API來說,從來都沒有計劃將其開放出來。它就是Android的“內部廚房”,對開發人員來說,應該將其視作黑盒。凡事都會有變化的。如果你依賴某些internal API,也有可能在新的Android release上,這些internal API發生變化,從而令你失望。

總結一下區別:

Hidden API = 進行中的工作;

Internal API = 黑盒;

一般情況下面,無論是hide api還是internal api都不能也不應該去訪問,當然你可以通過java的反射機制繞過這層限制,同時原文中也介紹了一些不通過反射也同樣可以訪問這些api的小技巧。



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.