首先,說下應(yīng)用場景
1.反射:主要跟類信息Class息息相關(guān),即,只有在運(yùn)行時(shí),才能知道需要調(diào)用哪個(gè)(子)類或者調(diào)用哪個(gè)(子)類的哪個(gè)方法。如果事先就知道的話,那我們絕對不用反射,為什么不事先生成好對象,才不要每運(yùn)行一次都生產(chǎn)一次對象,簡直是恐怖。
2.靜態(tài)代理:內(nèi)部其實(shí)沒有反射,是傳進(jìn)來被代理對象,然后在執(zhí)行被代理對象的具體方法前后織入一些代理操作,所以靜態(tài)代理的代理對象ProxyObj與被代理對象RealObj是需要實(shí)現(xiàn)共同的接口的。
3.動態(tài)代理:在基于靜態(tài)代理的基礎(chǔ)上,考慮到在某些應(yīng)用場景下,靜態(tài)代理對象ProxyObj其實(shí)是重復(fù)無意義的工作,比如我調(diào)RealObj所有的方法都是前打一行公共log,如果打印不同log用靜態(tài)代理再適合不過,但是如果是做相同的事情,那這個(gè)ProxyObj里面就是重復(fù)無意義的操作了,所以動態(tài)代理就可以解決這個(gè)應(yīng)用場景,動態(tài)代理類不再顯性得定義,而是再運(yùn)行時(shí),通過反射動態(tài)生成,并且是根據(jù)傳入進(jìn)來得RealObj來對應(yīng)生成一個(gè)代理對象,同時(shí)在每個(gè)方法中織入公共的代理操作。 其實(shí)我更愿意叫這個(gè)代理對象為被代理對象RealObj的變種,因?yàn)槲覜]有實(shí)際定義一個(gè)代理對象,更不知道他內(nèi)部有什么方法,我在調(diào)用它的方法的時(shí)候其實(shí)想的是RealObj內(nèi)部的方法,所以我更愿意叫它被代理對象RealObj的變種,而不是代理對象。
所以,綜上,究竟什么時(shí)候用靜態(tài)代理,什么時(shí)候用動態(tài)代理,什么時(shí)候用反射就很清楚了。
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請
點(diǎn)擊舉報(bào)。