• 手机版

    扫码体验手机版

  • 微信公众号

    扫码关注公众号

国内首家协议开发

软芯音视解码保护平台

在线
客服

发布
需求

在线
聊天

天盟
APP

天盟APP下载

关注
微信

微信扫一扫访问
顶部

java动态代理,为什么代理的方法总是会抛异常?

想问一下各位大神,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("删除");        }}

免责声明:本内容仅代表回答会员见解不代表天盟观点,请谨慎对待。

版权声明:作者保留权利,不代表天盟立场。

使用道具 举报

全部参与1

善用instanceof

if(argsinstanceoftype){        typenew_name=(type)args;        }

使用道具 举报

发新帖

发布任务需求已有1031289位用户正在使用天盟网服务

发布分类: *
任务预算: *
需求内容: *
手机号码: *
任务商家报价为
  • 预算价 :
  • 成交价 :
  • 完工期 :
  • 质保期 :

* 最终任务项目以服务商报价、双方协商为准!