天天看點

[Java基礎] 關于預設包通路權限類裡的public static成員的通路

參考:studyvcmfc的專欄 http://blog.csdn.net/studyvcmfc/article/details/5637180

《Java程式設計思想》(中文第四版)6.5節裡有一段話:

正如前面所提到的,如果沒能為類通路權限指定一個通路修飾符,它就會預設得到包通路權限。這意味着該類的對象可以由包内任何其他類來建立,但包外則是不行的。(一定要記住,相同目錄下的所有不具有明确package聲明的檔案,都被視作是該目錄下預設包的一部分。)然而,如果該類的某個static成員是public的話,則用戶端程式員仍舊可以調用該static成員,盡管他們并不能生成該類的對象。

其中,“然而,如果該類的某個static成員是public的話,則用戶端程式員仍舊可以調用該static成員,盡管他們并不能生成該類的對象。”這句話讓我覺得費解。非public類的字段怎麼可以被不同包的類通路呢?經過實驗,确實無法通過正常的 “類名.成員” 來通路他。

但是,通過Java反射是可以實作的。

Class dog = Class.forName("com.spz.javastudy.demo.Dog");
Field field = dog.getField("a");
field.setAccessible(true);
System.out.println(field.getInt(null));
           

就算Dog類是非public類,依靠反射機制依舊可以獲得Dog對象,并擷取其中的public static成員。