代理
最近在学习 Spring 框架,AOP涉及到动态代理的知识,故整理一下,了解动态代理之前,我们首先应该了解下什么是代理。
代理是基本的设计模式之一,它是你为了提供额外的或不同的操作,而插入的用来代替的"实际"对象的
对象,这些操作通常涉及与"实际"对象的通信,因此代理通常充当着中间人的角色。
当我们希望跟踪对方法的调用,或者希望度量这些调用的开销时,我们肯定不希望将这些代码合并到业务代码中,此时我们就可以使用代理来实现。下面我们通过一个示例了解下代理
代码演示1
定义一个接口
1 | public interface Behavior { |
接口的实现类
1 | public class Student implements Behavior { |
定义一个代理类
1 | public class SimpleProxy implements Behavior { |
测试
1 | @Test |
打印

动态代理
Java的动态代理比代理的思想更进一步。因为它可以动态的创建代理并动态的处理对所代理方法的调用在动
态代理上所做的所有调用都会被重定到单一的调用处理器上他的工作是揭示调用的类型并确定相应的对策
实现Java动态代理的过程中涉及到一个接口 InvocationHandler 以及一个类 Proxy。
接口:InvocationHandler
InvocationHandler is the interface implemented by the invocation handler
of a proxy instance.
译:
InvocationHandler是代理实例化对象的调用处理程序(invocation handler)实现的接口。
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 {@code invoke}method of its invocation handler.
译:
每个代理实例化对象都具有一个关联的调用处理程序(invocation handler)。当代理实例化对象
调用方法时,将对方法调用进行编码并将其指派到它的调用处理程序的 invoke 方法
InvocationHandler 仅有一个方法invoke()
Object invoke(Object proxy,Method method,Object[] args)throws Throwable
* @param proxy 调用方法的代理实例化对象
* @param method 指代的是我们所要调用真实对象的某个方法的Method对象
* @param args 指代的是调用真实对象某个方法时接受的参数
类:Proxy
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
该方法返回一个指定接口的动态代理实例化对象,该接口可以将方法调用指派到指定的调用处理程
序(invocation handler)
参数:
loader - 定义代理类的类加载器
interfaces - 代理类要实现的接口列表
h - 指派方法调用的调用处理程序
代码演示2
定义一个接口
1 | public interface Behavior { |
接口的实现类
1 | public class Student implements Behavior { |
创建一个动态代理处理器
1 | /** |
测试
1 | @Test |
打印
代码演示3
通过内部类定义具体的InvocationHandler
定义接口、实现类同上
创建 ProxyFactory
1 | public class ProxyFactory { |
测试
1 | @Test |
打印
Reference
1.java的动态代理机制详解 以及文章的评论使我受益匪浅
3.《Thinking In Java》