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

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

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

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

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

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

@Test
public 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对象运行的疑惑,我们将在下一篇文章中讲解。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值