【Java进阶-Java动态代理与AOP】04 实现InvocationHandler的invoke方法

来源:互联网 发布:midaspro3离线编辑软件 编辑:程序博客网 时间:2024/06/07 18:55

【Java进阶-Java动态代理与AOP】04 实现InvocationHandler的invoke方法

InvocationHandler接口中仅有一个抽象方法

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable

其中包含三个参数
proxy: 代理对象,帮助目标对象做事情的对象(卖联想电脑的代理商)
method: 代理对象要执行目标对象要完成的任务(帮A买联想电脑)
args: method方法需要的参数(需要的联想电脑的性能参数)

需要说明的是,这三个参数的传递是JDK自动完成的,我们只需要“按部就班”给出接口所需要的参数,就可以得到所要的动态类了,继而可以创建对象并完成某些操作。

@Testpublic void getProxy() {    System.out.println("new proxy instance ");    Collection collProxy = (Collection)Proxy.newProxyInstance(            Collection.class.getClassLoader(),            new Class[]{Collection.class},            new InvocationHandler(){                // 此处是硬编码,缺乏灵活性                ArrayList target = new ArrayList(); // 目标对象(联想公司电脑销售部)                @Override                /**                 * proxy: 代理对象,帮助目标对象做事情的对象(卖联想电脑的代理商)                 * method: 代理对象要执行目标对象要完成的任务(帮A买联想电脑)                 * args: method方法需要的参数(需要的联想电脑的性能参数)                 *                 * 代理最简单的实现是 return method.invoke(target, args);                 * 但是代理在返回值之前可以做其他事情,比如说过滤 args参数,不合格不予执行等等。                 */                public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {                    // return method.invoke(target, args);                    System.out.println("execute.....");                    long startTime = System.currentTimeMillis();                    Thread.sleep(1000);                    Object retVal = method.invoke(target,args);                    long endTime = System.currentTimeMillis();                    System.out.println(method.getName() + " execute time is " + (endTime - startTime));                    return retVal;                }            });    collProxy.add("123");    collProxy.add("abc");    int size = collProxy.size(); //invoke的返回值    System.out.println(size);    System.out.println(collProxy.getClass().getName());// com.sun.proxy.$Proxy0    //分析:查看 Proxy API文档:    //对于从Object继承过来的方法,只有 equals,hashCode和toString三个方法委托给handler处理,其他方法自己处理,如getClass方法}

可能还会存在对InvocationHandlerder对象运行的疑惑,我们将在下一篇文章中讲解。

阅读全文
1 0