想問一下各位大神,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("刪除");
}
}
添加回答
舉報
0/150
提交
取消