你知道java动态代理吗?那么它的原理又是怎样的呢?下面让我们一起彻底的来理解一下所谓的动态代理的原理吧。
首先简单的来给大家对动态代理做一个介绍。
动态代理其实就是一个代理机制。
假如你对设计模式当中的代理模式是很熟悉的,那么你一定会知道,可以将代理看成是对调用目标的一个包装,这样的话,对于目标代码的调用不是直接发生的,而是通过代理来完成的。
通过代理能够使得调用者和实现者之间解耦。
好比,通常进行RPC调用,框架内部的寻址、序列化、反系列化等,对于调用者来说一般都是没有很多的意义的,通过代理,能够使得界面更加的友善。
代理经历了从静态到动态的过程,源于静态代理引入的额外工作。
就好比是早期的RMI之类古董技术,还需要rmic之类工具生成静态stub等各种文件,增加了很多的繁琐的准备工作,而这和业务逻辑没有什么关系。
利用动态代理机制,相应的stub等类,能够在运行的时候生成,对应的调用操作也是动态完成,对生产力来一个极度的提升。
改进了之后,RMI已经不再需要手动去做这些事情了,虽然说它依旧是比较落后的技术,未来也许会被逐渐的移除掉。
下面来看一个简单的JDK动态代理的例子。
public class MyDynamicProxy { public static void main(String[] args) { HelloImpl hello = new HelloImpl(); MyInvocationHandler handler = new MyInvocationHandler(hello); // 构造代码实例 Hello proxyHello = (Hello) Proxy.newProxyInstance( HelloImpl.class.getClassLoader() , HelloImpl.class.getInterfaces() , handler); // 调用代理方法 proxyHello.sayHello(); } static interface Hello { void sayHello(); } static class HelloImpl implements Hello { @Override public void sayHello() { System.out.println("Hello World"); } } static class MyInvocationHandler implements InvocationHandler { private Object target; public MyInvocationHandler(Object target) { this.target = target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("Invoking sayHello"); Object result = method.invoke(target, args); return result; } } }
上面的例子,简单的实现了实现了动态代理的构建和代理操作。
简单来说:
1、实现对应的InvocationHandler
2、以接口Hello为纽带,为被调用目标构建代理对象,这样的话应用程序就能够使用代理对象间接运行调用目标的逻辑,代理为应用插入额外逻辑(这里是println)提供了便利的入口。
以上的内容就是对于动态代理的简单介绍,看完这些你都弄明白了吗?你对于动态代理还有什么疑问呢?
更多java方面的问题,大家可以继续关注奇Q工具网的常见问题栏目来了解哦。
推荐阅读: