再談Android的包級作用域

背景

做Android的童鞋對Java里的幾個作用域關(guān)鍵字肯定不陌生

public: 公開的,所有地方都可以訪問

private: 私有的,只有當(dāng)前類可以訪問

protected: 繼承的,當(dāng)前類和子類可訪問

default: 不包含任何作用域關(guān)鍵字,同一個包下可以訪問

在這里想和大家討論的就是這個default作用域,怎樣才算同一個包下呢?


如何在包外訪問default作用域的類或者方法

筆者寫了一個簡單的demo工程來驗證這個問題,工程結(jié)構(gòu)如下圖

Demo工程結(jié)構(gòu)

可以看到,這是一個標(biāo)準(zhǔn)的android工程結(jié)構(gòu),有app和test-lib兩個module,app依賴test-lib。

test-lib下有兩個類,代碼如下,Test1類為public,但test2和test3方法是default作用域。Test2類為default,且test2方法也是default的。

Test1.java
Test2.java

在app里的MainActivity里嘗試訪問這些default作用域的成員

訪問default作用域的成員

可以看到IDE報錯了,報錯信息如下

IDE提示不能訪問default作用域的方法

我們能訪問這些default作用域的方法嗎?有些童鞋可能會想到說用反射嘛,用反射確實可以訪問。不用反射能做到嗎?答案是可以的。我們在app module里建一個和Test1/Test2一樣的包,如下圖

在app module下建一個和test-lib一樣的包

在這個包名下新建TestProxy類,可以看到在TestProxy里可以成功地訪問default作用域修飾的方法和類。編譯是沒有問題了,能正常運(yùn)行嗎?修改代碼如下

調(diào)用TestProxy方法

運(yùn)行日志如下,可以看到也能成功運(yùn)行。

運(yùn)行成功

結(jié)論

是不是跟你理解的default作用域不太一樣呢?所以在Android里default作用域的類或者方法在模塊的包之下也是能夠訪問的,只需偽造一個和它一樣的包名即可。筆者也嘗試在Java里試了下,在Java里則會報錯,如下圖。都是用的java編譯器,為啥現(xiàn)象不一樣,有知道原因的同學(xué)歡迎留言告之^_^

Java里無法繞過default的限制
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容