更新時(shí)間:2023-01-29 15:28:50 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽2238次
1.代理模式的優(yōu)缺點(diǎn)?
優(yōu)點(diǎn)
協(xié)調(diào)調(diào)用者和被調(diào)用者,降低了系統(tǒng)的耦合度
代理對(duì)象作為客戶端和目標(biāo)對(duì)象之間的中介,起到了保護(hù)目標(biāo)對(duì)象的作用
缺點(diǎn)
由于在客戶端和真實(shí)主題之間增加了代理對(duì)象,因此會(huì)造成請(qǐng)求的處理速度變慢;
實(shí)現(xiàn)代理模式需要額外的工作(有些代理模式的實(shí)現(xiàn)非常復(fù)雜),從而增加了系統(tǒng)實(shí)現(xiàn)的復(fù)雜度。
2.為什么要使用動(dòng)態(tài)代理?
在靜態(tài)代理模式中一個(gè)靜態(tài)代理只服務(wù)一種類(lèi)型的目標(biāo)對(duì)象,若要服務(wù)多類(lèi)型的目標(biāo)對(duì)象,則需要為每種目標(biāo)對(duì)象都實(shí)現(xiàn)一個(gè)靜態(tài)代理對(duì)象。在目標(biāo)對(duì)象較多的情況下,若采用靜態(tài)代理,則會(huì)出現(xiàn) 靜態(tài)代理對(duì)象量多、代碼量大,從而導(dǎo)致代碼復(fù)雜的問(wèn)題。
3.什么是動(dòng)態(tài)代理?
動(dòng)態(tài)代理就是,在程序運(yùn)行期,創(chuàng)建目標(biāo)對(duì)象的代理對(duì)象,并對(duì)目標(biāo)對(duì)象中的方法進(jìn)行功能性增強(qiáng)的一種技術(shù)。在生成代理對(duì)象的過(guò)程中,目標(biāo)對(duì)象不變,代理對(duì)象中的方法是目標(biāo)對(duì)象方法的增強(qiáng)方法。可以理解為運(yùn)行期間,對(duì)象中方法的動(dòng)態(tài)攔截,在攔截方法的前后執(zhí)行功能操作。
代理類(lèi)在程序運(yùn)行期間,創(chuàng)建的代理對(duì)象稱之為動(dòng)態(tài)代理對(duì)象。這種情況下,創(chuàng)建的代理對(duì)象,并不是事先在Java代碼中定義好的。而是在運(yùn)行期間,根據(jù)我們?cè)趧?dòng)態(tài)代理對(duì)象中的“指示”,動(dòng)態(tài)生成的。也就是說(shuō),你想獲取哪個(gè)對(duì)象的代理,動(dòng)態(tài)代理就會(huì)為你動(dòng)態(tài)的生成這個(gè)對(duì)象的代理對(duì)象。動(dòng)態(tài)代理可以對(duì)被代理對(duì)象的方法進(jìn)行功能增強(qiáng)。有了動(dòng)態(tài)代理的技術(shù),那么就可以在不修改方法源碼的情況下,增強(qiáng)被代理對(duì)象的方法的功能,在方法執(zhí)行前后做任何你想做的事情。
4.動(dòng)態(tài)代理模式的原理?
1)動(dòng)態(tài)代理不需要顯式實(shí)現(xiàn)與目標(biāo)對(duì)象類(lèi)(RealSubject)相同的接口,而是將這種實(shí)現(xiàn)推遲到程序運(yùn)行時(shí)由 JVM來(lái)實(shí)現(xiàn)。即:在使用時(shí)再創(chuàng)建動(dòng)態(tài)代理類(lèi) & 實(shí)例;
2)通過(guò)Java 反射機(jī)制的method.invoke(),通過(guò)調(diào)用動(dòng)態(tài)代理類(lèi)對(duì)象方法,從而自動(dòng)調(diào)用目標(biāo)對(duì)象的方法。
008動(dòng)態(tài)代理的優(yōu)點(diǎn)和缺點(diǎn)?
優(yōu)點(diǎn)
1)只需要1個(gè)動(dòng)態(tài)代理類(lèi)就可以解決創(chuàng)建多個(gè)靜態(tài)代理的問(wèn)題,避免重復(fù)、多余代碼;
2)更強(qiáng)的靈活性;
缺點(diǎn)
1)效率低:相比靜態(tài)代理中直接調(diào)用目標(biāo)對(duì)象方法,動(dòng)態(tài)代理則需要先通過(guò)Java反射機(jī)制 從而間接調(diào)用目標(biāo)對(duì)象方法。
2)應(yīng)用場(chǎng)景局限:Java 的單繼承特性(每個(gè)代理類(lèi)都繼承了 Proxy 類(lèi)),即只能針對(duì)接口創(chuàng)建代理類(lèi),不能針對(duì)類(lèi)創(chuàng)建代理類(lèi)。
5.JDK動(dòng)態(tài)代理的實(shí)現(xiàn)步驟?
1.創(chuàng)建接口,定義目標(biāo)類(lèi)需要完成的功能
2.創(chuàng)建目標(biāo)類(lèi),實(shí)現(xiàn)接口。
3.創(chuàng)建InvocationHandler接口的實(shí)現(xiàn)類(lèi)。在invoke方法中完成代理類(lèi)的功能。
目標(biāo)方法的調(diào)用
功能增強(qiáng)
4.使用Proxy類(lèi)中靜態(tài)方法Proxy.newProxyInstance完成代理類(lèi)對(duì)象的創(chuàng)建,返回代理對(duì)象,并把返回值轉(zhuǎn)為接口類(lèi)型。
public class JDKDynamicProxy {
public static void main(String[] args) {
CAProxy caProxy = new CAProxy();
IA instance = (IA) caProxy.getInstance(new CA());
instance.say();
instance.fly();
}
}
interface IA{
void say();
void fly();
}
class CA implements IA{
@Override
public void say() {
System.out.println("I am class CA");
}
@Override
public void fly() {
System.out.println("I can fly");
}
}
class CAProxy implements InvocationHandler{
private Object target;
public Object getInstance(Object object){
this.target = object;
return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("I am proxy!");
Object result = method.invoke(target, args);
return result;
}
}
以上就是“必考知識(shí)點(diǎn):Java代理模式面試題”,你能回答上來(lái)嗎?如果想要了解更多的Java面試題相關(guān)內(nèi)容,可以關(guān)注動(dòng)力節(jié)點(diǎn)Java官網(wǎng)。
相關(guān)閱讀
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
有基礎(chǔ) 直達(dá)就業(yè)
業(yè)余時(shí)間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問(wèn)老師會(huì)電話與您溝通安排學(xué)習(xí)
初級(jí) 202925
初級(jí) 203221
初級(jí) 202629
初級(jí) 203743