java是什么 既然Java反射可以訪問(wèn)和修改私有成員變量,那封裝成private還有意義么?
既然Java反射可以訪問(wèn)和修改私有成員變量,那封裝成private還有意義么?很高興能回答你的問(wèn)題:簡(jiǎn)單來(lái)說(shuō),private并不是解決“安全”問(wèn)題的。安全是指不讓代碼被非法看到/訪問(wèn)。但是只要人能拿到
既然Java反射可以訪問(wèn)和修改私有成員變量,那封裝成private還有意義么?
很高興能回答你的問(wèn)題:
- 簡(jiǎn)單來(lái)說(shuō),private并不是解決“安全”問(wèn)題的。
- 安全是指不讓代碼被非法看到/訪問(wèn)。但是只要人能拿到代碼,總會(huì)有辦法去查看和改變代碼。
- private想表達(dá)的不是“安全性”的意思,而是OOP的封裝概念,是一種編譯器可以幫助你的設(shè)計(jì)。這就像是一家沒(méi)人的店掛了個(gè)牌子“閑人免進(jìn)”,但你真要進(jìn)去還是有各種辦法可以辦到。所以private,以及所有其他的access modifier都有一層隱含的含義:如果你按照遵守這套規(guī)則,開(kāi)發(fā)者可以保證不問(wèn)題(不考慮bug的情況下);否則,后果自負(fù)。
- 比如,你在用spring的IoC的時(shí)候,你知道你要“注入”,不管它是不是private的,你知道“注入”是你自己控制的,是你設(shè)計(jì)好的效果。那么通過(guò)spring的IoC利用反射幫你注入一些private property是再正常不過(guò)的用法。
- 再比如,單元測(cè)試,你就想測(cè)一個(gè)private方法。但是因?yàn)閜rivate的緣故就是測(cè)不了。于是你可以用反射繞開(kāi)這個(gè)限制,開(kāi)心的做測(cè)試。
總上所述,private只是個(gè)約定而已。