Skip to content

Commit fab7258

Browse files
caojx-gitjianx.cao001
authored andcommitted
更新 设计模式/代理模式.md
1 parent 7a50fbe commit fab7258

File tree

1 file changed

+37
-24
lines changed

1 file changed

+37
-24
lines changed

设计模式/代理模式.md

Lines changed: 37 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -157,39 +157,52 @@ public class StaticProxyTest {
157157
### 1.2 动态代理
158158
实现方式:
159159
1.JDK动态代理
160-
只能代理实现了接口的类
161-
没有实现接口的类不能实现JDK的动态代理
160+
161+
- 只能代理实现了接口的类
162+
163+
- 没有实现接口的类不能实现JDK的动态代理
164+
162165
2.CGLIB动态代理
163-
针对类来实现代理
164-
对指定目标类产生一个子类,通过方法拦截技术拦截所有父类方法的调用
165166

166-
上边的CarTimeProxy.java是我们对汽车的时间上的代理,假如我们又自行车,火车,其他类型的车需要时间上的代理,
167-
那么使用静态代理的时候,我们就需要创建其他的代理类,假如车类型很多的时候,就需要创建数量很多的代理类,这样
168-
就会造成我们的类爆炸,类膨胀。
167+
- 针对类来实现代理
169168

170-
使用动态代理就可以解决上边出现的问题,使用动态代理,我们事先并不需要知道被代理类和代理类实现的接口,代理类可以动态
171-
的获取被代理类实现的接口,这样就可以实现动态代理。
169+
- 对指定目标类产生一个子类,通过方法拦截技术拦截所有父类方法的调用
170+
171+
上边的CarTimeProxy.java是我们对汽车的时间上的代理,假如我们还有自行车,火车,其他类型的车需要时间上的代理,那么使用静态代理的时候,我们就需要创建其他的代理类,假如车类型很多的时候,就需要创建数量很多的代理类,这样就会造成我们的类爆炸,类膨胀。
172+
173+
使用动态代理就可以解决上边出现的问题,使用动态代理,我们事先并不需要知道被代理类和代理类实现的接口,代理类可以动态的获取被代理类实现的接口,这样就可以实现动态代理。
172174

173175
JDK Dynamic Proxy实现步骤:
174-
1.创建一个代理类实现InvocationHanhler接口,他必须实现invoke方法
175-
2.创建被代理的类以及接口
176-
3.调用Proxy的静态方法,创建一个代理类newProxyInstance(ClassLoader loader,Class[] interfaces,InvocationHandler h)
177-
4.代理类对象调用方法
176+
177+
- 1.创建一个代理类实现InvocationHanhler接口,他必须实现invoke方法
178+
- 2.创建被代理的类以及接口
179+
- 3.调用Proxy的静态方法,创建一个代理类newProxyInstance(ClassLoader loader,Class[] interfaces,InvocationHandler h)
180+
- 4.代理类对象调用方法
178181

179182
#### 1.2.1JDK的动态代理
180183
动态代理的原理图:
181184
![](../images/design/design-dynamic-proxy-jdk.png)
182185
Java动态代理类位于java.lang.reflect包下,一般主要涉及到以下两个类:
183-
(1)Interface InvocationHandler:该接口中仅定义了一个方法
184-
public Object invoke(Object obj,Method method, Object[] args)
185-
在实际使用时,第一个参数obj一般是指被代理的对象,method是被代理的方法,args为该方法的参数数组。
186-
这个方法在代理类中动态实现。
187-
(2)Proxy:该类即为动态代理类
188-
static Object newProxyInstance(ClassLoader loader,Class[] interfaces,InvocationHandler h)
189-
返回一个代理类的实例,返回后的代理类可以当作被代理类使用(可以使用被代理类的在接口中声明过的方法)。
190-
第一参数:loader 类加载器
191-
第二个参数:interfaces 实现类接口
192-
第三个参数:InvocationHandler h
186+
187+
- (1)Interface InvocationHandler:该接口中仅定义了一个方法
188+
189+
```java
190+
public Object invoke(Object obj,Method method, Object[] args)
191+
```
192+
193+
在实际使用时,第一个参数obj一般是指被代理的对象,method是被代理的方法,args为该方法的参数数组。
194+
这个方法在代理类中动态实现。
195+
196+
- (2)Proxy:该类即为动态代理类
197+
198+
```java
199+
static Object newProxyInstance(ClassLoader loader,Class[] interfaces,InvocationHandler h)
200+
```
201+
202+
返回一个代理类的实例,返回后的代理类可以当作被代理类使用(可以使用被代理类的在接口中声明过的方法)。
203+
第一参数:loader 类加载器
204+
第二个参数:interfaces 实现类接口
205+
第三个参数:InvocationHandler h
193206

194207
1.TimeHandler.java 时间代理类,实现InvocationHandler
195208
```java
@@ -248,7 +261,7 @@ public class JDKProxyTest {
248261
249262
#### 1.2.2 CGLIB动态代理
250263

251-
在目标类没有实现接口的情况下,我们可以使用CGLIB动态代理,通过拦截父类中的所有方法,生成一个子代理类,达到动态代理的目的。
264+
在目标类没有实现接口的情况下,我们可以使用CGLIB动态代理通过拦截父类中的所有方法,生成一个子代理类,达到动态代理的目的。
252265

253266
1.引入需要的jar
254267
```xml

0 commit comments

Comments
 (0)