动态代理的简要说明
在java的动态代理机制中,有两个重要的类或接口,一个是 InvocationHandler(Interface)、另一个则是 Proxy(Class)。
一、 InvocationHandler(interface)的描述:
InvocationHandler is the interface implemented by the invocation handler of a proxy instance.Each proxy instance has an associated invocation handler. When a method is invoked on a proxy instance, the method invocation is encoded and dispatched to the invoke method of its invocation handler.
每一个动态代理类都必须要实现InvocationHandler这个接口,并且每个代理类的实例都关联到了一个handler,当我们通过代理对象调用 一个方法的时候,这个方法的调用就会被转发为由InvocationHandler这个接口的 invoke 方法来进行调用。我们来看看InvocationHandler这个接口的唯一一个方法 invoke 方法:
Object invoke(Object proxy, Method method, Object[] args) throws Throwable
这个方法接收三个参数和返回一个Object类型,它们分别代表的意思如下:
proxy:指代我们所代理的那个真实对象method:指代的是我们所要调用真实对象的方法的Method对象args:指代的是调用真实对象某个方法时接受的参数返回的Object是指真实对象方法的返回类型,以上会在接下来的例子中加以深入理解。
the value to return from the method invocation on the proxy instance.
二、 Proxy(Class)的描述:
Proxy provides static methods for creating dynamic proxy classes and instances, and it is also the superclass of all dynamic proxy classes created by those methods.
Proxy这个类的作用就是用来动态创建一个代理对象。我们经常使用的是newProxyInstance这个方法:
public static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h) throws IllegalArgumentException
参数的理解:
返回结果的理解:一个代理对象的实例
a proxy instance with the specified invocation handler of a proxy class that is defined by the specified class loader and that implements the specified interfaces
简单的Java代理
我们创建一个Java项目用于对动态代理的测试与理解,项目结构如下:
一、 先定义一个接口Interface,添加两个方法
二、 定义一个真实的实现上述接口的类,RealObject:
三、 定义一个代理对象,也实现了上述的Interface接口:
四、 SimpleMain在Main方法中,测试上述的结果:
五、 运行的结果如下:
Java的动态代理
完成了上述简单的Java代理,现在我们开始学习Java的动态代理,它比代理的思想更向前一步,因为它可以动态地创建代理并动态的处理对所代理方法的调用。
在动态代理上所做的所有调用都会被重定向到单一的调用处理器上,它的工作是揭示调用的类型并确定相应的对策。下面我们通过案例来加深Java动态代理的理解:
一、 创建一个继承了InvocationHandler的处理器:DynamicProxyHandler
二、 我们写一个测试的Main方法,DynamicProxyMain
三、 运行结果如下:
从以上输出结果,我们可以得出以下结论:
与代理对象相关联的InvocationHandler,只有在代理对象调用方法时,才会执行它的invoke方法invoke的三个参数的理解:Object proxy是代理的对象, Method method是真实对象中调用方法的Method类, Object[] args是真实对象中调用方法的参数Java动态代理的原理
一、 动态代理的关键代码
就是Proxy.newProxyInstance(classLoader, interfaces, handler),我们跟进源代码看看:
二、 我们看一下newInstance方法的源代码:
三、 调用newInstance()方法
当我们通过代理对象调用 一个方法的时候,这个方法的调用就会被转发为由InvocationHandler这个接口的 invoke 方法来进行调用。
体现这句话的代码,我在源码中没有找到,于是我在测试类的main方法中加入以下代码:
这段代码的输出结果如下,与上述中调用代理对象中的getMyName方法输出是一样的,不知道Jvm底层是否是这样判断的:
声明:本文部分素材转载自互联网,如有侵权立即删除 。
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!
8. 精力有限,不少源码未能详细测试(解密),不能分辨部分源码是病毒还是误报,所以没有进行任何修改,大家使用前请进行甄别
丞旭猿论坛
暂无评论内容