JDK反射之JDK动态proxy
?
?
图1:代理模式类结构图
?
?
?
?
?
图2:代理模式序列图
?
2.JDK 动态代理
所谓 JDK 动态代理就是在运行时动态生成红色的代理类的过程。和静态代理不一样的地方是静态代理在编译期就要完成代理类 的实现。那么动态代理是如何实现的呢?
根据下面的例子,一步一步来看。
假设有这样一个接口 Speak:
?
??
?
?
图3:JDK动态代理调用过程
?
可以从上图看出来, JDK 动态反射并不是那么简单的一层代理,而是通过层层代理,最终通过 Method 的反射来调用目标对象的方法,而 aop 的实现可以放在 InvocationHandler 的是实现类里。
那么根据上述关于动态代理的简介,要实现 PersonSpeak 的 aop ,需要做两件事情
1.?????? 实现一个持有 Speak 对象的 InvocationHandler 子类,改子类通过 Mechod 反射调用 PersonSpeak 的方法,并在调用方法前后实现 aop 功能。
2.?????? 实现一个能动态创建 Speak 子类的代理类工厂,改工厂能动态的创建 Speak 子类。
?
具体实现如下:
1.??????? SpeakInvocationHandler ( 实现 InvocationHandler 接口 )
可以看出该类的 invoke 方法实现 aop 的关键,所有方法都是通过 invoke 来调用, invoke 内部通过反射来调用目标对象 target ,同时在调用前后实现了 aop 。
??
?
2.??????? ProxyFactory
?
?图4:Hessian远程服务调用过程
总结
JDK 动态代理是 java 反射的一个非常重要的特性, JDK 动态代理类还可以用来作为 SOAP 的远程服务代理类,总之它在某种程度上提供了 java 的动态性的特点,为应用提供了很大的灵活性。