想问一下各位大神,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
提交
取消