java CGLIB动态代理
CGLIB动态代理
- 一:CGLIB(Code Generation Library)是一个基于ASM的字节码生成库,它允许我们在运行时对字节码进行修改和动态生成。CGLIB通过继承方式实现代理。
- 二:使用cglib需要引入cglib的jar包,如果你已经有spring-core的jar包,则无需引入,因为spring中包含了cglib。
- 三:cglib代理无需实现接口,通过生成类字节码实现代理,比反射稍快,不存在性能问题,但cglib会继承目标对象,需要重写方法,所以目标对象不能为final类
话不多说,直接上代码
package com.zdp.csdn.zdpcsdn.cglibPractice;import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;import java.lang.reflect.Method;/**
* @author daniel
* @date 2019-05-01 21:44
*/
public class CglibProxy implements MethodInterceptor {//保存被代理的对象private Object target;public CglibProxy(Object target) {this.target = target;}//生成代理对象public Object createCgLibProxy(){//工具类Enhancer enhancer=new Enhancer();//设置被代理的对象,也可以理解为设置父类,因为动态代理类是继承了被动态代理类。enhancer.setSuperclass(target.getClass());//设置回调函数enhancer.setCallback(this);//创建子类的动态代理类对象return enhancer.create();}@Overridepublic Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {System.out.println("01:打开冰箱门~~~~");method.invoke(target,objects);System.out.println("03:关闭冰箱门~~~~");return null;}}
class test{public static void main(String[] args) {//新建被代理类的对象CglibPractice cglibPractice=new CglibPractice();//生成代理类对象CglibPractice cglibPracticeProxy=(CglibPractice)new CglibProxy(cglibPractice).createCgLibProxy();cglibPracticeProxy.doIt();//控制台输出内容/***01:打开冰箱门~~~~* 02:把大象塞进去~~~~* 03:关闭冰箱门~~~~**/}
}
java原生动态代理类和Cglib的区别
- 1.JDK动态代理是实现了被代理对象的接口,Cglib是继承了被代理对象。
- 2.JDK和Cglib都是在运行期生成字节码,JDK是直接写Class字节码,Cglib使用ASM框架写Class字节码,Cglib代理实现更复杂,生成代理类比JDK效率低。
- 3.JDK调用代理方法,是通过反射机制调用,Cglib是通过FastClass机制直接调用方法,Cglib执行效率更高。Cglib底层将方法全部存入一个数组中,通过数组索引直接进行方法调用
- 4.代理类将被代理类作为自己的父类并为其中的非final委托方法创建两个方法,一个是与委托方法签名相同的方法(重写机制),它在方法中会通过super调用委托方法;另一个是代理类独有的方法。在代理方法中,它会判断是否存在实现了MethodInterceptor接口的对象,若存在则将调用intercept方法对委托方法进行代理
java CGLIB动态代理相关推荐
- Java Cglib 动态代理intercept的参数含义
如何使用CGLIB创建动态代理,网上已经有很多资料,这里就不再赘述. 直接说结论. 当我们使用自定义类 private static class MethodInterceptorImpl imple ...
- 谁与争锋,JDK动态代理大战CGLib动态代理
文章目录 一.前言 二.基本概念 三.JDK 和 CGLib动态代理区别 3.1 JDK动态代理具体实现原理 3.2 CGLib动态代理 3.3 两者对比 3.4 使用注意 四.JDK 和 CGLib ...
- 深入理解Java Proxy和CGLIB动态代理原理
点击上方关注,每天进步一点点 动态代理在Java中有着广泛的应用,比如Spring AOP,Hibernate数据查询.测试框架的后端mock.RPC,Java注解对象获取等.静态代理的代理关系在编译 ...
- Java Proxy和CGLIB动态代理原理
动态代理在Java中有着广泛的应用,比如Spring AOP,Hibernate数据查询.测试框架的后端mock.RPC,Java注解对象获取等.静态代理的代理关系在编译时就确定了,而动态代理的代理关 ...
- Java动态代理的两种实现方法:JDK动态代理和CGLIB动态代理
Java动态代理的两种实现方法:JDK动态代理和CGLIB动态代理 代理模式 JDK动态代理 CGLIB动态代理 代理模式 代理模式是23种设计模式的一种,指一个对象A通过持有另一个对象B,可以具有B ...
- java动态代理和cglib动态代理
本文转自: http://blog.csdn.net/leon709/article/details/9529307 动态代理应用广泛,spring,Struts等框架很多功能是通过动态代理,或者进一 ...
- Java中的原生动态代理和CGLIB动态代理的原理,我不信你全知道!
作者:CarpenterLee cnblogs.com/CarpenterLee/p/8241042.html 动态代理在Java中有着广泛的应用,比如Spring AOP,Hibernate数据查询 ...
- java jdk动态代理 cglib动态代理demo
最近在研究java动态代理这块,以前也看了很多次java动态代理,感觉一直不是怎么明白,这两天看了看又明白了些,现给出我参考网上写的一个demo jdk动态代理实现: View Code import ...
- Java 静态代理、Java动态代理、CGLIB动态代理
为什么80%的码农都做不了架构师?>>> Java 的代理就是客户类不再直接和委托类打交道, 而是通过一个中间层来访问, 这个中间层就是代理.为啥要这样呢, 是因为使用代理有 ...
最新文章
- docker 嵌套技术 docker outside of docker 可用于一个容器内调用另一个容器内程序 跨容器调用 docker容器内获取自身容器信息
- 使用DETR指令提取电子客票票面信息
- 程序员关机代码python_Python实现远程开关机【高薪必备技术】
- 释放锁以及添加线程对于队列的变化
- (王道408考研操作系统)第五章输入/输出(I/O)管理-第一节2:I/O控制器
- 初学计算机语言者(C语言,C++,java,pytion,C#)
- 在这个功能上,iOS 落后 Android 了
- linux centeros下Redis的安装
- [模板] tarjan/联通分量/dfs树
- php 模拟登陆(不带验证码)采集数据
- 手动解除浏览器跨域限制
- 终极.NET混淆器丨.NET Reactor产品介绍
- xp系统配置打印服务器,xp系统打印机纸张大小的自定义设置方法
- 试题 基础练习 序列求和
- 2022考研数学 张宇 基础班【配套张宇30讲】【免费分享】
- 深度解析IPFS是什么
- 莫斯卡托葡萄酒的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
- 在Qt-Creator中使用搜狗输入中文的最简单解决方法(不需要编译安装)
- JavaScript——移动端网页特效
- 同样的代码不同环境 提示握手失败:ssl_client_socket_impl.cc handshake failed