轻松理解Java动态代理

动态代理是Java一种特殊的代理机制: 代理类动态生成,其优点是动态性,有两方面体现:

1)     代码动态生成, 因此可以少写很多代码,从这个角度,我们可以称动态代理是一种元编程

2)     工作类的具体类型是动态指定的, 增加了灵活性.

首先我们看一般代理的UML类图如下:


在(静态)代理中, 程序员实现的(静态定义)ProxyClass必须要(静态的,显式的)引用WorkClass

在Java动态代理中, Proxy对象由Proxy类的方法

      static Object newProxyInstance(
            ClassLoader loader,
            Class<?>[] interfaces,  // Proxy对象可以实现多个接口
            InvocationHandler handler)    // InvocationHandler持有WorkClass

生成,这个代理对象实现了参数给定的(可能多个)interfaces接口,当在这个代理对象上调用接口定义的方法时,将转换为调用InvocationHandler的invoke方法,方法由Method对象参数指定,调用方法的实参通过Object[]封装.程序员实现了InvocationHandler对象,在这个对象中需要引用一个WorkClass对象.在invoke方法中自定义做一些想要的操作,再将实际调用转到WorkClass对象上.这就是整个动态代理的实现过程.如下图所示:


通过对动态代理的类图和调用过程分析, 可以确定这是一种策略设计模式的实现.

ProxyClass类的实现变得简单: 所有接口定义方法的实现都是将调用外包给InvocationHandler,因此在newProxyInstance指定的接口将决定编译器如何生成这个类,由于ClassLoader具有类名字空间的属性,因此二元组(接口,ClassLoader)确定了一个ProxyClass类.





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值