为了账号安全,请及时绑定邮箱和手机立即绑定

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 关注
  • 2947 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信