@@ -157,39 +157,52 @@ public class StaticProxyTest {
157157### 1.2 动态代理
158158实现方式:
1591591.JDK动态代理
160- 只能代理实现了接口的类
161- 没有实现接口的类不能实现JDK的动态代理
160+
161+ - 只能代理实现了接口的类
162+
163+ - 没有实现接口的类不能实现JDK的动态代理
164+
1621652.CGLIB动态代理
163- 针对类来实现代理
164- 对指定目标类产生一个子类,通过方法拦截技术拦截所有父类方法的调用
165166
166- 上边的CarTimeProxy.java是我们对汽车的时间上的代理,假如我们又自行车,火车,其他类型的车需要时间上的代理,
167- 那么使用静态代理的时候,我们就需要创建其他的代理类,假如车类型很多的时候,就需要创建数量很多的代理类,这样
168- 就会造成我们的类爆炸,类膨胀。
167+ - 针对类来实现代理
169168
170- 使用动态代理就可以解决上边出现的问题,使用动态代理,我们事先并不需要知道被代理类和代理类实现的接口,代理类可以动态
171- 的获取被代理类实现的接口,这样就可以实现动态代理。
169+ - 对指定目标类产生一个子类,通过方法拦截技术拦截所有父类方法的调用
170+
171+ 上边的CarTimeProxy.java是我们对汽车的时间上的代理,假如我们还有自行车,火车,其他类型的车需要时间上的代理,那么使用静态代理的时候,我们就需要创建其他的代理类,假如车类型很多的时候,就需要创建数量很多的代理类,这样就会造成我们的类爆炸,类膨胀。
172+
173+ 使用动态代理就可以解决上边出现的问题,使用动态代理,我们事先并不需要知道被代理类和代理类实现的接口,代理类可以动态的获取被代理类实现的接口,这样就可以实现动态代理。
172174
173175JDK 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 )
182185Java动态代理类位于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
1942071.TimeHandler.java 时间代理类,实现InvocationHandler
195208``` java
@@ -248,7 +261,7 @@ public class JDKProxyTest {
248261
249262#### 1.2.2 CGLIB动态代理
250263
251- 在目标类没有实现接口的情况下,我们可以使用CGLIB动态代理, 通过拦截父类中的所有方法,生成一个子代理类,达到动态代理的目的。
264+ 在目标类没有实现接口的情况下,我们可以使用CGLIB动态代理, 通过拦截父类中的所有方法,生成一个子代理类,达到动态代理的目的。
252265
2532661.引入需要的jar
254267``` xml
0 commit comments