更新時(shí)間:2023-05-18 來源:黑馬程序員 瀏覽量:
Java中動(dòng)態(tài)代理是一種非常強(qiáng)大的機(jī)制,它可以用來在運(yùn)行時(shí)動(dòng)態(tài)地生成代理類,實(shí)現(xiàn)對被代理對象的攔截、增強(qiáng)等操作。Java中的動(dòng)態(tài)代理主要有兩種實(shí)現(xiàn)方式:基于接口的動(dòng)態(tài)代理和基于類的動(dòng)態(tài)代理。
基于接口的動(dòng)態(tài)代理是指代理類和被代理類都實(shí)現(xiàn)同一個(gè)接口,代理類通過實(shí)現(xiàn)InvocationHandler接口來攔截對被代理對象的方法調(diào)用。當(dāng)代理類的方法被調(diào)用時(shí),它會將方法調(diào)用轉(zhuǎn)發(fā)給InvocationHandler對象的invoke方法,從而實(shí)現(xiàn)對被代理對象的攔截和增強(qiáng)。
·對于實(shí)現(xiàn)了接口的類,可以直接使用基于接口的動(dòng)態(tài)代理進(jìn)行代理,非常方便。
·代理類和被代理類都必須實(shí)現(xiàn)同一個(gè)接口,能夠?qū)崿F(xiàn)對被代理對象的方法調(diào)用進(jìn)行統(tǒng)一管理。
·只能代理實(shí)現(xiàn)了接口的類,對于沒有實(shí)現(xiàn)接口的類無法使用此種方式進(jìn)行代理。
·無法攔截類中的final方法。
基于類的動(dòng)態(tài)代理是指代理類繼承自被代理類,代理類通過重寫被代理類的方法來攔截對被代理對象的方法調(diào)用。當(dāng)代理類的方法被調(diào)用時(shí),它會先調(diào)用被代理對象的方法,然后再進(jìn)行攔截和增強(qiáng)。
·可以代理沒有實(shí)現(xiàn)接口的類,比基于接口的動(dòng)態(tài)代理更加靈活。
·可以攔截類中的final方法。
·必須繼承被代理類,可能會造成類層次結(jié)構(gòu)復(fù)雜,不夠靈活。
·代理類和被代理類必須在同一個(gè)包中,如果被代理類不在同一個(gè)包中,則需要通過修改類加載器的方式實(shí)現(xiàn)動(dòng)態(tài)代理。