亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

java動態代理,為什么代理的方法總是會拋異常?

java動態代理,為什么代理的方法總是會拋異常?

kaguya 2016-09-23 22:41:59
想問一下各位大神,java動態代理時,如果被代理的方法有返回值,程序就會拋出一個類型不匹配異常,該如何處理?所做題目如下:寫一個ArrayList類的代理,實現和ArrayList類中完全相同的功能,并可以計算每個方法運行的時間。但是一直拋ClassCastException異常,自己研究一段時間發現是ArrayList 的.add(E e)方法傳回了一個booleanimport?java.lang.reflect.InvocationHandler; import?java.lang.reflect.Method; import?java.lang.reflect.Proxy; import?java.util.ArrayList; import?java.util.List; public?class?Demo?{ public?static?void?main(String[]?args)?{ ArrayList<String>?al?=?new?ArrayList<>(); MyInvocationHandler?m?=?new?MyInvocationHandler(al); List<String>?l?=?(List)Proxy.newProxyInstance(al.getClass().getClassLoader(),?al.getClass().getInterfaces(),?m); l.add("a"); } } class?MyInvocationHandler?implements?InvocationHandler?{ private?Object?obj; //構造方法接收一個對象類 public?MyInvocationHandler(Object?obj)?{ this.obj?=?obj; } //重寫?invoke方法 public?Object?invoke(Object?proxy,?Method?method,?Object[]?args)?throws?Throwable?{ long?start?=?System.currentTimeMillis(); method.invoke(obj,?args); //System.out.println("代理執行了"); long?end?=?System.currentTimeMillis(); System.out.println("添加完成"); System.out.println("共耗時:"+(end-start)+"毫秒"); //默認return?null?會造成空指針異常 return?obj; } }自己試著自定義一個類進行代理,無返回值的方法可以正常代理,后來在add(String str)方法里增加了返回值,同樣拋出異常import?java.lang.reflect.InvocationHandler; import?java.lang.reflect.Method; import?java.lang.reflect.Proxy; import?java.util.ArrayList; import?java.util.List; public?class?Demo?{ public?static?void?main(String[]?args)?{ //下面這個拋出ClassCastException,確認是被代理方法有返回值造成的 UserImp?ui?=?new?UserImp(); MyInvocationHandler?m?=?new?MyInvocationHandler(ui); User?u?=?(User)Proxy.newProxyInstance(ui.getClass().getClassLoader(),?ui.getClass().getInterfaces(),?m); u.add("aaa"); } } class?MyInvocationHandler?implements?InvocationHandler?{ private?Object?obj; //構造方法接收一個對象類 public?MyInvocationHandler(Object?obj)?{ this.obj?=?obj; } //重寫?invoke方法 public?Object?invoke(Object?proxy,?Method?method,?Object[]?args)?throws?Throwable?{ long?start?=?System.currentTimeMillis(); method.invoke(obj,?args); //System.out.println("代理執行了"); long?end?=?System.currentTimeMillis(); System.out.println("添加完成"); System.out.println("共耗時:"+(end-start)+"毫秒"); return?obj; } } //User接口//TODO interface?User?{ String[]?arr?=?new?String[10]; public?String?add(String?str); public?void?del(); } //User的實現類 class?UserImp?implements?User?{ public?String?add(String?str)?{ System.out.println(str); arr[0]?=?str; return?"aa"; } public?void?del()?{ System.out.println("刪除"); } }
查看完整描述

2 回答

已采納
?
阿旭_

TA貢獻217條經驗 獲得超353個贊

善用instanceof

if?(args?instanceof?type)?{
	type?new_name?=?(type)?args;	
}


查看完整回答
2 反對 回復 2016-09-24
  • kaguya
    kaguya
    是在 method.invoke(obj,args); 那里強轉么?求細說,我剛接觸java一個月不太懂...
  • 阿旭_
    阿旭_
    OK,給你重新發個完整的代碼
  • 2 回答
  • 1 關注
  • 3035 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

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

公眾號

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