时间:2021-05-19
什么是代理模式?
代理模式:在调用处不直接调用目标类进行操作,而是调用代理类,然后通过代理类来调用目标类进行操作。在代理类调用目标类的前后可以添加一些预处理和后处理操作来完成一些不属于目标类的功能。
为什么要使用代理模式?
通过代理模式可以实现对目标类调用的控制、在目标类调用前/后进行一些不属于目标类的操作,如:数据验证、预处理、后处理、异常处理等
什么是静态代理什么是动态代理?
jdk代理和cglib代理区别在哪里?
不同点:jdk动态代理的目标类必须实现的有接口,因为在调用Proxy.newProxyInstance()的时候需要传入目标类的接口类。而cglib不做此限制。
下面看代码分析:
定义一个Person接口
package com.zpj.designMode.proxy;//定义一个Person接口public interface Person { public void doWork();}添加一个实现类:MrLi
package com.zpj.designMode.proxy;//添加一个实现类public class MrLi implements Person { @Override public void doWork() { System.out.println("-----doWork"); }}静态代理:
添加一个静态代理类Proxy
package com.zpj.designMode.proxy;//静态代理,代理必须和目标类实现共同的接口public class Proxy implements Person { private Person person;// 被代理人 //这里的目标类型决定了该代理类只能代理实现了Person接口的实例,而不能接收其他类型参数,这也就是静态代理的局限性 public Proxy(Person person) { this.person = person; } @Override public void doWork() { System.out.println("doSomething-----start"); person.doWork(); System.out.println("doSomething-----end"); }}静态代理测试程序:
package com.zpj.designMode.proxy;public class Run { public static void main(String[] args) { MrLi li = new MrLi(); Proxy proxy = new Proxy(li); //调用处直接调用代理进行目标方法的操作。 proxy.doWork(); }}JDK动态代理:
添加一个代理JDKProxy,该代理实现InvocationHandler接口且覆写invoke方法。
package com.zpj.designMode.proxy.jdk;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;/*** @author Perkins Zhu @date 2017年3月13日 上午8:41:10 */public class JDKProxy implements InvocationHandler { private Object person;// 被代理人 //这里的目标类型为Object,则可以接受任意一种参数作为被代理类,实现了动态代理。但是要注意下面的newProxyInstance()中的参数 public Object getInstance(Object person) { this.person = person; //与cglib的区别在于这里构建代理对象的时候需要传入被代理对象的接口对象,第二个参数。而cglib不需要被代理对象实现任何接口即可 return Proxy.newProxyInstance(person.getClass().getClassLoader(), person.getClass().getInterfaces(), this); } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("doSomething---------start"); method.invoke(person, args); System.out.println("doSomething---------end"); return null; }}JDK动态代理测试程序
package com.zpj.designMode.proxy.jdk;import com.zpj.designMode.proxy.MrLi;import com.zpj.designMode.proxy.Person;/*** * @author Perkins Zhu * @date 2017年3月13日 上午8:51:31 */public class Run { public static void main(String[] args) { Person person = (Person) new JDKProxy().getInstance(new MrLi()); //注意这里的person不是目标类person,而是代理类person:debug的时候显示null,有'$'标识符 person.doWork(); }}Cglib动态代理:
添加一个CglibProxy代理,同时实现MethodInterceptor接口。
package com.zpj.designMode.proxy.cglib;import java.lang.reflect.Method;import net.sf.cglib.proxy.Enhancer;import net.sf.cglib.proxy.MethodInterceptor;import net.sf.cglib.proxy.MethodProxy;/*** * @author Perkins Zhu * @date 2017年3月13日 上午9:02:54 */public class CglibProxy implements MethodInterceptor { private Object targetObject; // 这里的目标类型为Object,则可以接受任意一种参数作为被代理类,实现了动态代理 public Object getInstance(Object target) { this.targetObject = target; Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(target.getClass()); enhancer.setCallback(this); //注意该处代理的创建过程 Object proxyObj = enhancer.create(); return proxyObj;// 返回代理对象 } @Override public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { Object obj = null; System.out.println("doSomething---------start"); obj = method.invoke(targetObject, args); System.out.println("doSomething---------end"); return obj; }}Cglib动态代理测试程序
package com.zpj.designMode.proxy.cglib;import com.zpj.designMode.proxy.MrLi;import com.zpj.designMode.proxy.Person;/*** @author Perkins Zhu @date 2017年3月13日 上午9:07:38 */public class Run { public static void main(String[] args) { Person person = (Person)new CglibProxy().getInstance(new MrLi()); person.doWork(); }}仔细对比Proxy、CglibProxy和JDKProxy区分静态代理、JDK动态代理和Cglib动态代理的异同点!
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
Java中动态代理主要有JDK和CGLIB两种方式。区别主要是jdk是代理接口,而cglib是代理类。优点:这种方式已经解决我们前面所有日记需要的问题。非常的灵
java代理有jdk动态代理、cglib代理,这里只说下jdk动态代理,jdk动态代理主要使用的是java反射机制(既java.lang.reflect包)原理
今天来介绍另一种更为强大的代理——Cglib动态代理。 什么是Cglib动态代理? 我们先回顾一下上一篇的jdk动态代理,jdk动态代理是通过接口来在运
spring中提供了两种动态代理的方式,分别是JavaProxy以及cglibJavaProxy只能代理接口,而cglib是通过继承的方式,实现对类的代理添加一
一、背景今天有小伙伴面试的时候被问到:SpringAOP中JDK和CGLib动态代理哪个效率更高?二、基本概念首先,我们知道SpringAOP的底层实现有两种方