Java静态代理、动态代理以及CGLIB动态代理
代理模式是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动态代理相关推荐
- 什么是代理模式?代理模式有什么用?通过一个小程序分析静态代理和动态代理。自己简单实现动态代理。JDK动态代理和CGLIB动态代理的区别。
1. 代理模式有什么用 ①功能增强,在实现目标功能的基础上,又增加了额外功能.就像生活中的中介一样,他跟两边客户会有私下的交流. ②控制访问,代理不让用户直接和目标接触.就像中间商一样,他们不会让我们 ...
- Java动态代理的两种实现方法:JDK动态代理和CGLIB动态代理
Java动态代理的两种实现方法:JDK动态代理和CGLIB动态代理 代理模式 JDK动态代理 CGLIB动态代理 代理模式 代理模式是23种设计模式的一种,指一个对象A通过持有另一个对象B,可以具有B ...
- Java中的原生动态代理和CGLIB动态代理的原理,我不信你全知道!
作者:CarpenterLee cnblogs.com/CarpenterLee/p/8241042.html 动态代理在Java中有着广泛的应用,比如Spring AOP,Hibernate数据查询 ...
- Java两种动态代理JDK动态代理和CGLIB动态代理
目录 代理模式 JDK动态代理 cglib动态代理 测试 代理模式 代理模式是23种设计模式的一种,他是指一个对象A通过持有另一个对象B,可以具有B同样的行为的模式.为了对外开放协议,B往往实现了一个 ...
- Java中动态代理的两种方式JDK动态代理和cglib动态代理以及区别
视频功能审核通过了,可以看视频啦!记得点关注啊~ 注意:因为网络原因,视频前一两分钟可能会比较模糊,过一会儿就好了 记得点关注啊,视频里的wx二维码失效了,wx搜索:"聊5毛钱的java&q ...
- 静态代理、JDK与CGLIB动态代理、AOP+IoC原理
静态代理.JDK与CGLIB动态代理.AOP+IoC 希望大家认真看完,感谢写这文章的大牛 目录 一.为什么需要代理模式 二.静态代理 三.动态代理,使用JDK内置的Proxy实现 四.动态代理,使用 ...
- JAVA 进阶篇 动态代理 JDK动态代理和CGlib动态代理
JDK动态代理和CGlib动态代理 JDK动态代理: 利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理. CGlib动态代理: 利用ASM(开源的Java ...
- 你必须会的 JDK 动态代理和 CGLIB 动态代理
来自:ytao 我们在阅读一些 Java 框架的源码时,基本上常会看到使用动态代理机制,它可以无感的对既有代码进行方法的增强,使得代码拥有更好的拓展性.通过从静态代理.JDK 动态代理.CGLIB 动 ...
- 利用代码分别实现jdk动态代理和cglib动态代理_面试之动态代理
大家好!我是CSRobot,从今天开始,我将会发布一些技术文章,内容就是结合春招以来的面试所遇到的问题进行分享,首先会对知识点进行一个探讨和整理,在最后会给出一些面试题并作出解答,希望可以帮助到大家! ...
- cglib动态代理jar包_Java中的原生动态代理和CGLIB动态代理的原理,我不信你全知道!...
作者:CarpenterLee cnblogs.com/CarpenterLee/p/8241042.html 动态代理在Java中有着广泛的应用,比如Spring AOP,Hibernate数据查询 ...
最新文章
- Javascript的数据结构与算法(一)
- leetcode @38报数-js
- KDD 2021 | 异质图神经网络的可微元图搜索
- Emscripten-mac安装与升级
- [mybatis]映射文件_select_resultMap_关联查询
- 数据结构与算法--图论最短路径算法应用-词阶求解
- asp.net将内容导出到Excel,Table表格数据(html)导出EXCEL
- C语言课后习题(27)
- J2EE之初识JSP
- 【mysql知识点总结】
- 医院常用系统简称说明(HIS 、LIS、PACS等)
- java 企业微信对接_Java对接企业微信
- 苹果手机能写代码html,这些隐藏在苹果iPhone当中的内置代码你是否知道?
- ModelState.IsValid 验证时忽略某些字段验证
- 打开图片或者视频显示“文件系统错误-2147416359”
- 进化算法——反向学习
- 三防平板终端丨三防平板电脑丨三防平板如何应用在工业中?
- Object-Oriented Programming Summary Ⅲ
- 基于微信小程序的健康管理系统-计算机毕业设计
- 软件工程课程周学习进度报告——第四周
热门文章
- 【STM32 .Net MF开发板学习-03】TinyGUI绘图示例
- 《数字图像处理与机器视觉——Visual C++与Matlab实现》——0.2 数字图像处理与识别...
- 使用grafana4的alert功能
- EGO走进美团——追寻千亿市场背后的技术力量
- JSP学习笔记1:JSP生命周期
- python list append 相关知识点
- 【Word】关于Word文档写作中遇到的一些问题
- 如何从基础到深入了解java构造器
- 鸿蒙系统非手机用,【图片】华为鸿蒙系统的厉害之处在于 你可能非用不可
!【手机吧】_百度贴吧...
- oracle 存档终点修改,Oracle 归档模式与非归档模式的切换