代理模式是java中最常用的设计模式之一,尤其是在spring框架中广泛应用。对于java的代理模式,一般可分为:静态代理、动态代理、以及CGLIB实现动态代理。
对于上述三种代理模式,分别进行说明。

1.静态代理

静态代理其实就是在程序运行之前,提前写好被代理方法的代理类,编译后运行。在程序运行之前,class已经存在。
下面我们实现一个静态代理demo:

静态代理

定义一个接口Target

package com.test.proxy;
public interface Target {public String execute();
}

TargetImpl 实现接口Target

package com.test.proxy;
public class TargetImpl implements Target {@Overridepublic String execute() {System.out.println("TargetImpl execute!");return "execute";}
}

代理类

package com.test.proxy;
public class Proxy implements Target{private Target target;public Proxy(Target target) {this.target = target;}@Overridepublic String execute() {System.out.println("perProcess");String result = this.target.execute();System.out.println("postProcess");return result;}
}

测试类:

package com.test.proxy;
public class ProxyTest {public static void main(String[] args) {Target target = new TargetImpl();Proxy p = new Proxy(target);String result =  p.execute();System.out.println(result);}
}

运行结果:

perProcess
TargetImpl execute!
postProcess
execute

静态代理需要针对被代理的方法提前写好代理类,如果被代理的方法非常多则需要编写很多代码,因此,对于上述缺点,通过动态代理的方式进行了弥补。

2.动态代理

动态代理主要是通过反射机制,在运行时动态生成所需代理的class.

动态代理

接口

package com.test.dynamic;
public interface Target {public String execute();
}

实现类

package com.test.dynamic;
public class TargetImpl implements Target {@Overridepublic String execute() {System.out.println("TargetImpl execute!");return "execute";}
}

代理类

package com.test.dynamic;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;public class DynamicProxyHandler  implements InvocationHandler{private Target target;public DynamicProxyHandler(Target target) {this.target = target;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("========before==========");Object result = method.invoke(target,args);System.out.println("========after===========");return result;}
}

测试类

package com.test.dynamic;
import java.lang.reflect.Proxy;public class DynamicProxyTest {public static void main(String[] args) {Target target = new TargetImpl();DynamicProxyHandler handler = new DynamicProxyHandler(target);Target proxySubject = (Target) Proxy.newProxyInstance(TargetImpl.class.getClassLoader(),TargetImpl.class.getInterfaces(),handler);String result = proxySubject.execute();System.out.println(result);}
}

运行结果:

========before==========
TargetImpl execute!
========after===========
execute

无论是动态代理还是静态带领,都需要定义接口,然后才能实现代理功能。这同样存在局限性,因此,为了解决这个问题,出现了第三种代理方式:cglib代理。

3.cglib代理

CGLib采用了非常底层的字节码技术,其原理是通过字节码技术为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑。JDK动态代理与CGLib动态代理均是实现Spring AOP的基础。

cglib动态代理

目标类

package com.test.cglib;
public class Target {public String execute() {String message = "-----------test------------";System.out.println(message);return message;}
}

通用代理类:

package com.test.cglib;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;public class MyMethodInterceptor implements MethodInterceptor{@Overridepublic Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {System.out.println(">>>>MethodInterceptor start...");Object result = proxy.invokeSuper(obj,args);System.out.println(">>>>MethodInterceptor ending...");return "result";}
}

测试类

package com.test.cglib;
import net.sf.cglib.proxy.Enhancer;
public class CglibTest {public static void  main(String ... args) {System.out.println("***************");Target target = new Target();CglibTest test = new CglibTest();Target proxyTarget = (Target) test.createProxy(Target.class);String res = proxyTarget.execute();System.out.println(res);}public Object createProxy(Class targetClass) {Enhancer enhancer = new Enhancer();enhancer.setSuperclass(targetClass);enhancer.setCallback(new MyMethodInterceptor());return enhancer.create();}
}

执行结果:

***************
>>>>MethodInterceptor start...
-----------test------------
>>>>MethodInterceptor ending...
result

代理对象的生成过程由Enhancer类实现,大概步骤如下:
1、生成代理类Class的二进制字节码;
2、通过Class.forName加载二进制字节码,生成Class对象;
3、通过反射机制获取实例构造,并初始化代理类对象。

Java静态代理、动态代理以及CGLIB动态代理相关推荐

  1. 什么是代理模式?代理模式有什么用?通过一个小程序分析静态代理和动态代理。自己简单实现动态代理。JDK动态代理和CGLIB动态代理的区别。

    1. 代理模式有什么用 ①功能增强,在实现目标功能的基础上,又增加了额外功能.就像生活中的中介一样,他跟两边客户会有私下的交流. ②控制访问,代理不让用户直接和目标接触.就像中间商一样,他们不会让我们 ...

  2. Java动态代理的两种实现方法:JDK动态代理和CGLIB动态代理

    Java动态代理的两种实现方法:JDK动态代理和CGLIB动态代理 代理模式 JDK动态代理 CGLIB动态代理 代理模式 代理模式是23种设计模式的一种,指一个对象A通过持有另一个对象B,可以具有B ...

  3. Java中的原生动态代理和CGLIB动态代理的原理,我不信你全知道!

    作者:CarpenterLee cnblogs.com/CarpenterLee/p/8241042.html 动态代理在Java中有着广泛的应用,比如Spring AOP,Hibernate数据查询 ...

  4. Java两种动态代理JDK动态代理和CGLIB动态代理

    目录 代理模式 JDK动态代理 cglib动态代理 测试 代理模式 代理模式是23种设计模式的一种,他是指一个对象A通过持有另一个对象B,可以具有B同样的行为的模式.为了对外开放协议,B往往实现了一个 ...

  5. Java中动态代理的两种方式JDK动态代理和cglib动态代理以及区别

    视频功能审核通过了,可以看视频啦!记得点关注啊~ 注意:因为网络原因,视频前一两分钟可能会比较模糊,过一会儿就好了 记得点关注啊,视频里的wx二维码失效了,wx搜索:"聊5毛钱的java&q ...

  6. 静态代理、JDK与CGLIB动态代理、AOP+IoC原理

    静态代理.JDK与CGLIB动态代理.AOP+IoC 希望大家认真看完,感谢写这文章的大牛 目录 一.为什么需要代理模式 二.静态代理 三.动态代理,使用JDK内置的Proxy实现 四.动态代理,使用 ...

  7. JAVA 进阶篇 动态代理 JDK动态代理和CGlib动态代理

    JDK动态代理和CGlib动态代理 JDK动态代理: 利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理. CGlib动态代理: 利用ASM(开源的Java ...

  8. 你必须会的 JDK 动态代理和 CGLIB 动态代理

    来自:ytao 我们在阅读一些 Java 框架的源码时,基本上常会看到使用动态代理机制,它可以无感的对既有代码进行方法的增强,使得代码拥有更好的拓展性.通过从静态代理.JDK 动态代理.CGLIB 动 ...

  9. 利用代码分别实现jdk动态代理和cglib动态代理_面试之动态代理

    大家好!我是CSRobot,从今天开始,我将会发布一些技术文章,内容就是结合春招以来的面试所遇到的问题进行分享,首先会对知识点进行一个探讨和整理,在最后会给出一些面试题并作出解答,希望可以帮助到大家! ...

  10. cglib动态代理jar包_Java中的原生动态代理和CGLIB动态代理的原理,我不信你全知道!...

    作者:CarpenterLee cnblogs.com/CarpenterLee/p/8241042.html 动态代理在Java中有着广泛的应用,比如Spring AOP,Hibernate数据查询 ...

最新文章

  1. Javascript的数据结构与算法(一)
  2. leetcode @38报数-js
  3. KDD 2021 | 异质图神经网络的可微元图搜索
  4. Emscripten-mac安装与升级
  5. [mybatis]映射文件_select_resultMap_关联查询
  6. 数据结构与算法--图论最短路径算法应用-词阶求解
  7. asp.net将内容导出到Excel,Table表格数据(html)导出EXCEL
  8. C语言课后习题(27)
  9. J2EE之初识JSP
  10. 【mysql知识点总结】
  11. 医院常用系统简称说明(HIS 、LIS、PACS等)
  12. java 企业微信对接_Java对接企业微信
  13. 苹果手机能写代码html,这些隐藏在苹果iPhone当中的内置代码你是否知道?
  14. ModelState.IsValid 验证时忽略某些字段验证
  15. 打开图片或者视频显示“文件系统错误-2147416359”
  16. 进化算法——反向学习
  17. 三防平板终端丨三防平板电脑丨三防平板如何应用在工业中?
  18. Object-Oriented Programming Summary Ⅲ
  19. 基于微信小程序的健康管理系统-计算机毕业设计
  20. 软件工程课程周学习进度报告——第四周

热门文章

  1. 【STM32 .Net MF开发板学习-03】TinyGUI绘图示例
  2. 《数字图像处理与机器视觉——Visual C++与Matlab实现》——0.2 数字图像处理与识别...
  3. 使用grafana4的alert功能
  4. EGO走进美团——追寻千亿市场背后的技术力量
  5. JSP学习笔记1:JSP生命周期
  6. python list append 相关知识点
  7. 【Word】关于Word文档写作中遇到的一些问题
  8. 如何从基础到深入了解java构造器
  9. 鸿蒙系统非手机用,【图片】华为鸿蒙系统的厉害之处在于 你可能非用不可 !【手机吧】_百度贴吧...
  10. oracle 存档终点修改,Oracle 归档模式与非归档模式的切换