Java动态代理总结
a) 什么是Proxy Design Pattern?
在说Java动态代理之前,先复习下代理模式(Proxy Pattern)。如下类图所示:
一旦有了代理,它将代替被代理类去参与程序的业务逻辑。代理和被代理都实现了同样的接口,并且代理类会hold一个被代理类,这样当在代理上调用业务方法的时候,代理可以把真正的核心逻辑仍然让被代理类去完成。
?
b) Java的动态代理(Dynamic Proxy)是怎么回事?
简单说动态代理是Java提供的一种机制,它是在运行的时候基于一个或多个接口(Interface)创造出实现该接口或多个接口的代理类实例。值得再加强一提的是,Dynamic Proxy是基于接口的,它能为单个或者多个接口创建一个代理类实例。这个机制主要有两个类参与实现:
??? - java.lang.reflect.Proxy
??? - java.lang.reflect.InvocationHandler
?
1. java.lang.reflect.Proxy
Proxy是一个实现了Serializable的具体类,它里面的方法主要就是用来根据必要的条件创建出指定接口或者是多个接口的代理类。下面就是其提供的常用的public方法:
?
SubjectProxy的代码
?
?这里这个类和类图中传统的Proxy Pattern有出入了,这个SubjectProxy没有去实现Subject接口,而是实现了InvocationHandler。在Client类中,Proxy会把SubjectProxy和它需要实现的Subject做绑定的,也就是下面几句Client的代码,小小的重复贴一下之前在Client中的几行关键代码如下:
?
2. java.lang.reflect.Proxy的源代码写得挺精彩。它使用到了loaderToCache的一个WeakHashMap,使程序在做缓存的同时不会泄漏内存,值得学习。
?
3. 当代理需要实现多个接口,并且多个接口中有些方法duplicate了,那顺序会起决定作用,在Class[]中最前面的那个接口会被认为是方法的提供者!