<强>,Java动态代理机制强>
在学习春天的时候,我们知道春天主要有两大思想,一个是国际奥委会,另一个就是AOP,对于奥委会,依赖注入就不用多说了,而对于春天的核心AOP来说,我们不但要知道怎么通过AOP来满足的我们的功能,我们更需要学习的是其底层是怎么样的一个原理,而AOP的原理就是Java的动态代理机制,所以本篇随笔就是对Java的动态机制进行一个回顾。
在java的动态代理机制中,有两个重要的类或接口,一个是InvocationHandler(接口),另一个则是代理(类),这一个类和接口是实现我们动态代理所必须用到的。首先我们先来看看java API的帮助文档是怎么样对这两个类进行描述的:
InvocationHandler:
InvocationHandler是接口实现的代理实例的调用处理程序。 每个代理实例都有一个关联的调用处理程序。当一个方法被调用> 对象调用对象代理、方法方法,对象[]args)抛出Throwable
我们看到这个方法一共接受三个参数,那么这三个参数分别代表什么呢?
代理:指代我们所代理的那个真实对象
方法:指代的是我们所要调用真实对象的某个方法的方法对象
参数:指代的是调用真实对象某个方法时接受的参数
如果不是很明白,等下通过一个实例会对这几个参数进行更深的讲解。
接下来我们来看看代理这个类:
代理提供了用于创建动态代理类和实例的静态方法,也是所有创建动态代理类的超类的方法。
代理这个类的作用就是用来动态创建一个代理对象的类,它提供了许多的方法,但是我们用的最多的就是newProxyInstance这个方法:
公共静态对象newProxyInstance(类加载器加载程序,Class<& # 63;在[]接口, InvocationHandler h)抛出IllegalArgumentException
返回一个指定接口,一个代理类的实例方法分派 之前调用指定的调用处理程序。>这个方法的作用就是得到一个动态的代理对象,其接收三个参数,我们来看看这三个参数所代表的含义:
加载程序:一个类加载器对象,定义了由哪个类加载器对象来对生成的代理对象进行加载 接口:一个界面对象的数组,表示的是我将要给我需要代理的对象提供一组什么接口,如果我提供了一组接口给它,那么这个代理对象就宣称实现了该接口(多态),这样我就能调用这组接口中的方法了 h:一个InvocationHandler对象,表示的是当我这个动态代理对象在调用方法的时候,会关联到哪一个InvocationHandler对象上好了,在介绍完这两个接口(类)以后,我们来通过一个实例来看看我们的动态代理模式是什么样的:
首先我们定义了一个主题类型的接口,为其声明了两个方法:
公共接口问题 { 公共空间租金(); 公共空间你好(String str); } >之前接着,定义了一个类来实现这个接口,这个类就是我们的真实对象,RealSubject类:
公共类RealSubject实现主题 { @Override 公共空间租金() { system . out。println(“我想租我的房子”); } @Override 公共空间你好(String str) { system . out。println(“你好:”+ str); } } >之前下一步,我们就要定义一个动态代理类了,前面说个,每一个动态代理类都必须要实现InvocationHandler这个接口,因此我们这个动态代理类也不例外:
公共类了DynamicProxy实现InvocationHandler {//这个就是我们要代理的真实对象 私有对象主体;//构造方法,给我们要代理的真实对象赋初值 公开了DynamicProxy(对象主题) { 这一点。主题=主题; } @Override 公共对象调用对象对象,方法方法,对象[]参数) 抛出Throwable {//在代理真实对象前我们可以添加一些自己的操作 system . out。println(“之前租的房子”); system . out。println(方法:+方法);//当代理对象调用真实对象的方法时,其会自动的跳转到代理对象关联的处理程序对象的调用方法来进行调用 方法。调用(主题,args);//在代理真实对象后我们也可以添加一些自己的操作 system . out。println(“租房子后”); 返回null; } }Java动态代理机制的实例详解