JAVA动态代理的内部实现

JAVA动态代理的内部实现

一 代理设计模式

代理模式为目标对象提供一种代理以控制对实际对象的访问。在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

为了保持行为的一致性,代理类和实际委托类通常会实现相同的接口,所以在访问者看来两者没有丝毫的区别。



代理模式类图


常见的代理有:
1) 远程代理(Remote Proxy):对一个位于不同的地址空间对象提供一个局域代表对象,如RMI中的stub。 
2) 虚拟代理(Virtual Proxy):根据需要将一个资源消耗很大或者比较复杂的对象,延迟加载,在真正需要的时候才创建。
3) 保护代理(Protect or Access Proxy):控制对一个对象的访问权限。
4) 智能引用(Smart Reference Proxy):提供比目标对象额外的服务和功能。

通过代理类这一中间层,能够有效控制对实际委托类对象的直接访问,也可以很好地隐藏和保护实际对象,实施不同的控制策略,从而在设计上获得了更大的灵活性。

二 动态代理使用

JAVA动态代理机制以巧妙的方式实现了代理模式的设计理念。

 


动态代理类图


动态代理在代理ProxySubject和RealSubject之间增加了InvocationHandler这一层,这是一种通信间接化,增加了灵 性性,例如可以把这个中间层实现为一个框架Framework,直接通过xml文件等方式来调用RealSubject。

在普通的设计中,我们一般不会使用动态代理。但是在一些框架结构设计中,动态代理非常重要,如RMI,EJB中都使用动态代理。


动态代理具体使用如下:

 

 


三 动态代理内部实现

通过调用Proxy类的newProxyInstance工厂方法,动态地生成了ProxySubject,所有的方法调用都被委派到InvocationHandler的invoke方法,invoke方法通关Method反射执行RealSubject对应的方法.我们可以推测动态代理类ProxySubject肯定实现了Subjedt接口,并包含一个InvocationHandler对象引用,这是从Proxy继承而得到的。当调用接口中的每个方法时。通过反射调用得到对应的Method对象。并调用invoke方法。

我们可以验证我们的推测是否时正确的。通过Proxy类的源代码我们了解类Proxy的getProxyClass方法调用ProxyGenerator的 generateProxyClass方法产生ProxySubject.class的二进制数据:


public static byte[] generateProxyClass(final String name, Class[] interfaces)


我们可以import sun.misc.ProxyGenerator,调用 generateProxyClass方法产生binary data,然后写入文件,最后通过反编译工具来查看内部实现原理,如上面的createProxyClassFile()方法。

反编译后的ProxySubject.java如下,其中无关的代码被删除了。



 

我们可以看到动态代理的内部实现和我们前面的推测相同,并且我们可以实现自己的一个动态代理生成器。如果你想探究ProxyGenerator内部是如何生成class二进制数据,可以参考下面部分的源代码。



 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值