Java代理模式——CGLIB动态代理
对于动态代理,如果没有定义代理类接口,而只是定义了代理类,那么此时JDK动态代理就无法使用了,因为JDK动态代理要求必须定义接口,它是对接口进行代理的,现在没有定义接口,那么自然就不能使用JDK动态代理了。
这时,我们就可以使用CGLIB动态代理来实现。
CGLIB是一个功能强大,高性能的代码生成包(CGLIB就是用来生成代码的,它也是在内存中动态的去生成的)
因为CGLIB是第三方提供的包,所以我们需要在maven工程中引入对应jar包:
<!--CGLIB--><dependency><groupId>cglib</groupId><artifactId>cglib</artifactId><version>3.3.0</version></dependency>
接下来,CGLIB动态代理代码实现:
新建被代理类,我们这里用NaiKeCloth(耐克服装厂)举例。此时并不需要再新建Cloth接口,因为我们现在是要使用CGLIB进行代理
package com.hxk.pattern.proxy.cglib_proxy.lx;/*** 被代理类:耐克服装厂** @author **** @create 2022-05-20 20:17*/
public class NaiKeCloth {public void makeCloth(String type){System.out.println("制作服装:" + type);}public String brand(){return "我的品牌是:耐克";}
}
新建工厂类,即ProxyFactory,该工厂就是用来获取代理对象的,所以我们应该在该工厂类中定义一个获取代理对象的方法,此时,使用CGLIB进行代理的话,获得的代理类就是目标对象所属类的子类。
使用CGLIB来进行代理:
- 创建Enhancer类对象,该类类似于JDK动态代理中的Proxy类。它就是用来获取代理对象的。注意该类是属于CGLIB里面的,所以我们要导入相对应的包。
- 设置父类的字节码对象。使用CGLIB生成的代理类是属于目标类的子类的,也就是说代理类是要继承自目标类的。
- 设置回调函数。
ProxyFactory代码实现:
package com.hxk.pattern.proxy.cglib_proxy.lx;import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;import java.lang.reflect.Method;/*** @author **** @create 2022-05-20 20:19*/
public class ProxyFactory<T> implements MethodInterceptor {private T obj;public ProxyFactory(T obj) {this.obj = obj;}public T getProxy(){// 1. 创建Enhancer类对象,它类似于咱们JDK动态代理中的Proxy类,该类就是用来获取代理对象的Enhancer enhancer = new Enhancer();// 2. 设置父类的字节码对象。为啥子要这样做呢?因为使用CGLIB生成的代理类是属于目标类的子类的,也就是说代理类是要继承自目标类的enhancer.setSuperclass(obj.getClass());// 3. 设置回调函数enhancer.setCallback(this);// 4. 创建代理对象return (T) enhancer.create();}@Overridepublic Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {if (method.getName().equals("makeCloth")){System.out.println("制作服装前的准备.........");}Object invoke = method.invoke(obj, objects);if (method.getName().equals("makeCloth")){System.out.println("对制作好的服装打包处理");}return invoke;}
}
最后就是测试类进行测试:
package com.hxk.pattern.proxy.cglib_proxy.lx;/*** @author **** @create 2022-05-21 8:36*/
public class Client {public static void main(String[] args) {NaiKeCloth cloth = new NaiKeCloth();NaiKeCloth proxy = new ProxyFactory<NaiKeCloth>(cloth).getProxy();proxy.makeCloth("短袖");String brand = proxy.brand();System.out.println(brand);}
}
我们来看一下运行结果:
最后,若是有接口,则你可以使用JDK动态代理(看我主页静态代理和动态代理)带来实现代理;若是没有接口,则你就可以使用CGLIB进行代理。
Java代理模式——CGLIB动态代理相关推荐
- cglib动态代理jar包_代理模式详解:静态代理+JDK/CGLIB 动态代理实战
1. 代理模式 代理模式是一种比较好的理解的设计模式.简单来说就是 我们使用代理对象来代替对真实对象(real object)的访问,这样就可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标 ...
- Java 静态代理、Java动态代理、CGLIB动态代理
为什么80%的码农都做不了架构师?>>> Java 的代理就是客户类不再直接和委托类打交道, 而是通过一个中间层来访问, 这个中间层就是代理.为啥要这样呢, 是因为使用代理有 ...
- Java静态代理、动态代理以及CGLIB动态代理
代理模式是java中最常用的设计模式之一,尤其是在spring框架中广泛应用.对于java的代理模式,一般可分为:静态代理.动态代理.以及CGLIB实现动态代理. 对于上述三种代理模式,分别进行说明. ...
- Java内功修炼系列:代理模式及动态代理
目录 一 代理模式 1.1 简介 1.2 代理模式角色定义 二 静态代理 2.1 介绍和实例 2.2 静态代理的缺点 三 动态代理 3.1 基于JDK原生动态代理实现 四 小结 一 代理模式 1.1 ...
- Java 结合实例学会使用 静态代理、JDK动态代理、CGLIB动态代理
前言 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 很多人至今都是看到 代理就懵, 静态代理.动态代理.JDK动态代理.CGL ...
- Java拾遗:007 - 代理模式与动态代理
2019独角兽企业重金招聘Python工程师标准>>> 代理模式 在日常开发中我们可以会接手一些老的项目,有时连源码都没有,或者有时候我会需要对业务逻辑做一定增强(功能扩展,如:日志 ...
- Java篇 - 代理模式和动态代理实现原理
设计模式中有一种模式叫代理模式,Spring框架离不开动态代理技术,Android hook技术用到了反射 + 动态代理,Framework中我们也经常看到各种proxy,如ApplicationTh ...
- 代理详解 静态代理+JDK/CGLIB 动态代理实战
1. 代理模式 代理模式是一种比较好理解的设计模式.简单来说就是 我们使用代理对象来代替对真实对象(real object)的访问,这样就可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对 ...
- 浅谈Spring中JDK动态代理与CGLIB动态代理
前言 Spring是Java程序员基本不可能绕开的一个框架,它的核心思想是IOC(控制反转)和AOP(面向切面编程).在Spring中这两个核心思想都是基于设计模式实现的,IOC思想的实现基于工厂模式 ...
- 静态代理,JDK动态代理,Cglib动态代理详解
目录 一.代理模式 二.静态代理 三.动态代理 3.1 JDK动态代理 3.2 Cglib动态代理 四.两种动态代理区别 一.代理模式 代理模式(Proxy Pattern)是程序设计中的一种设计模式 ...
最新文章
- 逆向工程破解苹果监控iPhone图片的算法:原来iOS14.3上就有了
- session_unset()和session_destroy()的区别
- 打算尝试瑜伽,看是否能解决长期困扰的胃痛问题
- android最大json,Android:解析大型JSON文件
- char* 和char[] 内存分配的区别(转载)
- c++ mysql 配置文件_C++操作数据库写入到json配置文件中
- 向MFC应用程序添加控制台窗口
- Design pattern
- iOS5 UIKit新特性
- 简述C#中IO的应用 RabbitMQ安装笔记 一次线上问题引发的对于C#中相等判断的思考 ef和mysql使用(一) ASP.NET/MVC/Core的HTTP请求流程...
- torchtext用法
- 公文排版字体要求以及印制要求
- 8种排序算法(Java实现)
- 软件测试--移动应用主要针对软测比赛(教程)
- 【C语言】斐波那契数列
- NCConverter for mac(NCM音乐格式文件转换器)
- android添加nfc门禁卡,IOS14nfc怎么添加门禁卡?NFC门禁卡教程[多图]
- C++实现的简单k近邻算法(K-Nearest-Neighbour,K-NN)
- 红豆熟了之后会生出什么呢?
- Arnold 渲染设置 - Main - Sampling 采样设置
热门文章
- php淘口令,淘口令使用说明
- Python数据预处理--Gensim构建语料词典
- 扩展卡尔曼滤波算法——基本原理及举例(python实现radar数据滤波)
- ss导航java宝典_ss导航绅士宝典app下载-ss导航绅士宝典百度网盘官方版下载v1.1.0-七度网...
- 很详细的讲解什么以及为什么是卷积(Convolution)!
- 谈一下MVVM 框架
- 封装SIP和SOIC有什么区别
- Qt报错:qt.qpa.xcb: QXcbConnection: XCB error: 8 (BadMatch).....
- 后端学习 Java 面向指挥官的操作系统
- VMware搭建docker mastodon