既然Java反射可以訪問和修改私有成員變數,那封裝成private還有意義麼?

時間 2021-05-05 19:41:11

1樓:Doraemon

我覺得反射有且只有一種意義:為某些需要更高靈活性的第三方框架提供服務。

典型的如 FastJSON, Jackson 這類 JSON 實體轉換框架,必須靠反射遍歷類方法,獲得你實體類裡的所有 getter/setter 方法才能操作。我們也很樂意使用這樣的框架,總比乙個乙個手動賦值要優雅得多。

而且就算是這種情形下的反射,我覺得也應該遵守乙個基本法,只遍歷其 public 屬性的成員/方法。同樣是 JSON 轉實體框架,像 Gson 那樣直接用反射獲得 private 字段然後修改其值的做法我也並不是太贊同。GitHub 上有網友對此也產生過疑問。

Why not getter and setter? · Issue #185 · google/gson

其他形式的反射都會破壞封裝,都是在耍流氓。而且通過反射呼叫私有 API 的同時也繞過了編譯器對相應語法的檢測,更容易觸發執行時異常。

2樓:syk

那你是不知道python是怎麼表示私有成員的,python在屬性名前加乙個下劃線就表示是私有屬性了,當然這不耽誤別人繼續訪問,只是所有人都遵守的規定,在正常使用過程中不要訪問下劃線打頭的屬性。

3樓:高靖宇

做各種規範有時候也為了方便開發吧。打個比方,乙個類Class裡如果都是public方法變數,當你在其它地方呼叫這個類(Class class)的時候,class.你會發現,IDE給你推薦了密密麻麻的一大堆變數方法,是不是會覺得頭大?

分清哪些適用於內外部呼叫,也是給自己行方便

4樓:MaxwellGeng

我來槓一波,既然記憶體都是Memory Allocate,那為什麼要用類呢?直接用unsigned long long儲存記憶體位址不就行了?

所以話說回來,物件導向也好,面向過程也罷,其實都是給人設計的,public private也是,是為了告訴「人」,哪個是能用的哪個是不能用的,對電腦來說其實都是一樣的。

5樓:ABCDEFG

為了降低複雜度,對於使用者,你只要了解公有函式和變數的作用就可以,不必了解實現細節。對於想知道細節的人又提供了反射,可以說是非常人性化了。

6樓:

private只是一種編碼規範而已,告知你不應該去使用它,很多指令碼語言中根本就沒有private,public之分的,,,就像法律規定不能闖紅燈,不照樣有人不遵守?

7樓:Mageek Chiu

private是一種思想,並不強求你實現,所以你也可以全部public,但是封裝性就不好。

還有反射這個是可以通過security manager 解決的。

8樓:金自翔

妹子穿超短裙時裡面會穿個安全褲。

超短裙是public,妹子露出來就隨便你看。

安全褲是private,妹子認為正常人不應該往裡看。

其實安全褲也能硬扒下來(reflect),但如果你在街上隨便扒女孩褲子,被警察抓你也沒啥可說的是不是。

「既然安全褲能被硬扒下來,那妹子穿安全褲還有意義麼?」

9樓:鄭小信

防君子不防小人啊。

當然了也不一定要用反射……

所以我極個別時候(唯一一次)不想用反射是這樣的,qnmd包級私有……不給我提供我想要改的東西?直接用你的包名同樣繼承乙個類再拿來用啦!

10樓:Anqur

這麼說吧, reflect 甚至可以改 final 的值, 而 JVM 應對使用者修改 final 值也有相關優化.

不用反射去動態改屬性, 編譯器可提供更可靠的靜態分析. 使用反射的話還能實現 dependency injection 這種好東西. 說白了是個 tradeoff.

11樓:布客飛龍

麻煩啊,反射多麻煩,要寫好幾句話。

c++的所有類成員都可以通過指標+偏移來修改,還定義類幹嘛,直接來個大陣列不就得了。可是,你不覺得麻煩嗎?

12樓:Tengyu

封裝成private???我覺得這句話……有點問題吧,封裝的物件是類,對類進行封裝,private知識修飾作用,在我們使用類的時候打點是不顯示這個方法的。對於類的使用者,除非他知道你私有方法的名字和引數列表,否則他還是不能用,即使使用也沒什麼吧,修飾符是起到修飾的作用,還有就是我覺得對反射使用的比較好的就是hibernate和mybatis(ibatis)了,我們平時應該不會取用反射的方式來呼叫乙個方法吧,想要使用就宣告為public的。

作為程式設計師,不要鑽牛角尖……我也是新手,發表了不成熟的看法,嘿嘿

既然可見光被反射,其他電磁能也能被反射嗎?

RaySir 文字地,可以被反射,也就可以被吸收。這兩個物理過程一定同時存有。使用麥波的 麥克斯韋電磁波及其思考動力學 思想,電磁波能量可以被行波中的電子流所反射 說是疊加到入射波上,可能更好D 吸收就是電場向量或磁場向量激勵電荷或磁偶極子而形成電流或交變磁場但後面這兩者遭引導出來了的說。使用德波的...

JAVA中,怎麼才能做到多伺服器資料庫訪問?

galaxyyao 題主有點沒描述清楚到底最終目的是要幹啥。是否是要訪問C業務系統的使用者,能從伺服器A那裡動態獲取到C伺服器的位址麼?另外題主的關注點也有點偏了。重點不是你用資料庫還是什麼儲存,後端框架是不是用SSH,前端用什麼JS UI框架。思路可能可以參考一下SSO重定向 關鍵字搜sso re...

用ip位址可以訪問,用網域名稱卻不能訪問應該怎麼解決

阿信 1 網域名稱沒解析到伺服器ip位址上,或者伺服器沒有繫結你的網域名稱 2 網域名稱沒有備案可能被伺服器廠商攔截 3 網域名稱解析伺服器出現了問題,導致網域名稱解析通訊中斷 4 網域名稱因違規被牆了 具體請參考 什麼是網域名稱被牆?網域名稱被牆有什麼解決辦法?解決方法就要對症下藥了 如果網域名稱...