专业的JAVA编程教程与资源

网站首页 > java教程 正文

java:动态代理机制详解(java动态代理的两种方式)

temp10 2024-10-04 12:32:38 java教程 10 ℃ 0 评论

在学习Spring的时候,我们知道Spring主要有两大核心,一个是IoC,另一个就是AOP,对于AOP来说,它的原理就是java的动态代理机制。实现动态代理主要有两种方式,分别jdk动态代理和cglib动态代理,以下主要介绍JDK动态代理。

先举个例子,实现动态代理的功能:

java:动态代理机制详解(java动态代理的两种方式)

1、在java中规定,要想产生一个对象的代理对象,那么这个对象必须要有一个接口,首先我们定义了一个UserService 类型的接口,为其声明了两个方法:

2、接着,定义了一个类来实现这个接口,这个类就是我们的真实对象,UserServiceImpl类:

3、下一步,我们就要定义一个动态代理类了,每一个动态代理类都必须要实现 InvocationHandler 这个接口

接下来,就可以做个简单的测试

运行结果如下,动态代理已经生效:

下面,我们简单介绍下jdk的动态代理,每一个动态代理类都必须要实现InvocationHandler这个接口,并且每个代理类的实例都关联到了一个handler,当我们通过代理对象调用一个方法的时候,这个方法的调用就会被转发为由InvocationHandler这个接口的 invoke 方法来进行调用。下面,我们来看看InvocationHandler这个接口的唯一一个方法 invoke 方法:

我们看到这个方法一共接受三个参数,那么这三个参数分别代表什么呢?

proxy: 指代我们所代理的那个真实对象

method: 指代的是我们所要调用真实对象的某个方法的Method对象

args: 指代的是调用真实对象某个方法时接受的参数

接下来我们来看看Proxy这个类,Proxy这个类的作用就是用来动态创建一个代理对象的类,它提供了许多的方法,但是我们用的最多的就是 newProxyInstance 这个方法,这个方法的作用就是得到一个动态的代理对象,

其接收三个参数,我们来看看这三个参数所代表的含义:

loader: 一个ClassLoader对象,定义了由哪个ClassLoader对象来对生成的代理对象进行加载

interfaces: 一个Interface对象的数组,表示的是我将要给我需要代理的对象提供一组什么接口,如果我提供了一组接口给它,那么这个代理对象就宣称实现了该接口(多态),这样我就能调用这组接口中的方法了

h: 一个InvocationHandler对象,表示的是当我这个动态代理对象在调用方法的时候,会关联到哪一个InvocationHandler对象上

好的,动态代理就简单介绍到这了

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表