第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

請教請教,路過的也看一看,幫一幫我,出點主意

請教請教,路過的也看一看,幫一幫我,出點主意

有一種放棄叫三分熱情 2017-09-08 12:05:40
關于動態(tài)代理的那些事 (JDK的動態(tài)代理)有3個接口,分別為ProxyInter1,ProxyInter2,ProxyInter3,但是接口2繼承接口3public?interface?ProxyInter1{ void?func(); }public?interface?ProxyInter2?extends?ProxyInter3{ void?run(); }public?interface?ProxyInter3?{ void?sun(); }下面這個是被代理的類,實現(xiàn)了ProxyInter1,ProxyInter2兩個接口public?class?ProxyImp?implements?ProxyInter1,ProxyInter2{ @Override public?void?func()?{ System.out.println("This?is?function"); } @Override public?void?run()?{ System.out.println("This?is?run"); } @Override public?void?sun()?{ System.out.println("This?is?sun"); } }下面這個是代理的類的執(zhí)行:public?class?MyProxy?{ ????public?static?void?main(String[]?args)?throws?Exception?{ ProxyInter1?proxyInter1?=?new?ProxyImp(); ProxyInter2?proxyInter2?=?new?ProxyImp(); ProxyInter3?proxyInter3?=?new?ProxyImp(); ProxyInter3?pInter?=?(ProxyInter3)?Proxy.newProxyInstance (proxyInter1.getClass().getClassLoader(),?proxyInter1.getClass().getInterfaces(),new?InvocationHandler(){ @Override public?Object?invoke(Object?proxy,?Method?method,?Object[]?args)?throws?Throwable?{ System.out.println("這是代理之前的事情"); Object?object?=?method.invoke(proxyInter1,args); System.out.println("這是代理之后的事情"); return?object; ????} }); // pInter.func(); pInter.sun(); ????} }我的疑問是:1、ProxyInter1,ProxyInter3只是兩個接口,沒有任何關系,invoke方法里面?zhèn)鞯膮?shù)為proxyInter1對象,但是上面Proxy.newProxyInstance返回類型為什么是ProxyInter3的類型,卻不是ProxyInter1類型的,而且調用的方法只能是ProxyInter3的方法,不能調用ProxyInter1的,2、在Proxy.newProxyInstance方法中,按常理說,調用被代理類的類加載器,被代理類的接口(Interfaces),但是,里面寫上proxyInter1,proxyInter2,proxyInter3的三種任意一個都不會報錯,問題是ProxyInter1 和ProxyInter2個接口沒有任何關系,運行出來一樣不會報錯,這是什么原因?麻煩各位大佬幫我解答下,讓我這個小白漲漲知識。。。。。
查看完整描述

1 回答

已采納
?
HansonQ

TA貢獻223條經驗 獲得超56個贊

//1、第一個問題你生成的代理對象是給ProxyInter1這個目標對象,但是你卻強轉為ProxyInter3,這個newProxyInstance方法的返回值是一個Object.既然是另一個對象當然不能調用別的對象方法
//2、第二個我之間誒寫的代碼
public?class?MyProxy?{
????public?static?void?main(String[]?args)?{
????????final?ProxyInter1?proxyInter1?=?new?ProxyImp();

????????ProxyInter2?proxyInter2?=?new?ProxyImp();
????????ProxyInter3?proxyInter3?=?new?ProxyImp();

????????/**
?????????*?Proxy.newProxyInstance
?????????*??????????參數(shù)1:loader,類加載器,動態(tài)代理類?運行時創(chuàng)建,任何類都需要類加載器將其加載到內存當中
?????????*??????????????要求:傳遞的是被代理的類加載器ClassLoader(非必須)
?????????*??????????????類加載器怎樣獲???
?????????*??????????????????一般情況下:當前類.class.getClassLoader獲取加載器
?????????*??????????????????????????目標類實例.getClass().getClassLoader獲取加載器
?????????*??????????參數(shù)2:Class[]?interfaces:代理類需要實現(xiàn)的所有接口
?????????*??????????????要求:得到被代理對象所實現(xiàn)的接口的所有Class對象
?????????*?????????????????方式1:目標類實例.getClass().getInterfaces();注意只能獲得自己的接口,不能獲得父元素接口
?????????*?????????????????方式2:new?Class[]{UserService.class}
?????????*????????????????例如:jdbc驅動-->DriverManager?獲得接口Connection
?????????*??????????參數(shù)3:InvocationHandler?處理類,接口,必須進行實現(xiàn),一般采用匿名內部類
?????????*??????????????????提供了一個invoke方法,代理類的每一個方法執(zhí)行時,都將調用一次invoke
?????????*??????????????????????參數(shù)?3.1、Object?proxy:代理對象
?????????*??????????????????????參數(shù)?3.2、Method?method:代理對象當前執(zhí)行的方法的描述對象(反射)
?????????*??????????????????????參數(shù)?3.3、Object[]?args:方法的實際參數(shù)
?????????*/
????????ProxyInter1?inter1?=?(ProxyInter1)?Proxy.newProxyInstance(MyProxy.class.getClassLoader(),?proxyInter1.getClass().getInterfaces(),?new?InvocationHandler()?{
????????????@Override
????????????public?Object?invoke(Object?proxy,?Method?method,?Object[]?args)?throws?Throwable?{
????????????????System.out.println("call??method?before?...");
????????????????Object?object?=?method.invoke(proxyInter1,?args);
????????????????System.out.println("call??method?after?...");
????????????????return?object;
????????????}
????????});
????????inter1.func();
????}
}


查看完整回答
反對 回復 2017-09-08
  • 1 回答
  • 0 關注
  • 1280 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號