想问一下各位大神,java动态代理时,如果被代理的方法有返回值,程序就会抛出一个类型不匹配异常,该如何处理?
所做题目如下:
写一个ArrayList类的代理,实现和ArrayList类中完全相同的功能,并可以计算每个方法运行的时间。
但是一直抛ClassCastException异常,自己研究一段时间发现是ArrayList 的.add(E e)方法传回了一个boolean
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) { ArrayList al = new ArrayList(); MyInvocationHandler m = new MyInvocationHandler(al); List 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接口//TODOinterface 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("删除"); }} |