对于动态代理,如果没有定义代理类接口,而只是定义了代理类,那么此时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来进行代理:

  1. 创建Enhancer类对象,该类类似于JDK动态代理中的Proxy类。它就是用来获取代理对象的。注意该类是属于CGLIB里面的,所以我们要导入相对应的包。
  2. 设置父类的字节码对象。使用CGLIB生成的代理类是属于目标类的子类的,也就是说代理类是要继承自目标类的。
  3. 设置回调函数。

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动态代理相关推荐

  1. cglib动态代理jar包_代理模式详解:静态代理+JDK/CGLIB 动态代理实战

    1. 代理模式 代理模式是一种比较好的理解的设计模式.简单来说就是 我们使用代理对象来代替对真实对象(real object)的访问,这样就可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标 ...

  2. Java 静态代理、Java动态代理、CGLIB动态代理

    为什么80%的码农都做不了架构师?>>>    Java 的代理就是客户类不再直接和委托类打交道, 而是通过一个中间层来访问, 这个中间层就是代理.为啥要这样呢, 是因为使用代理有 ...

  3. Java静态代理、动态代理以及CGLIB动态代理

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

  4. Java内功修炼系列:代理模式及动态代理

    目录 一 代理模式 1.1 简介 1.2 代理模式角色定义 二 静态代理 2.1 介绍和实例 2.2 静态代理的缺点 三 动态代理 3.1 基于JDK原生动态代理实现 四 小结 一 代理模式 1.1 ...

  5. Java 结合实例学会使用 静态代理、JDK动态代理、CGLIB动态代理

    前言 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 很多人至今都是看到 代理就懵, 静态代理.动态代理.JDK动态代理.CGL ...

  6. Java拾遗:007 - 代理模式与动态代理

    2019独角兽企业重金招聘Python工程师标准>>> 代理模式 在日常开发中我们可以会接手一些老的项目,有时连源码都没有,或者有时候我会需要对业务逻辑做一定增强(功能扩展,如:日志 ...

  7. Java篇 - 代理模式和动态代理实现原理

    设计模式中有一种模式叫代理模式,Spring框架离不开动态代理技术,Android hook技术用到了反射 + 动态代理,Framework中我们也经常看到各种proxy,如ApplicationTh ...

  8. 代理详解 静态代理+JDK/CGLIB 动态代理实战

    1. 代理模式 代理模式是一种比较好理解的设计模式.简单来说就是 我们使用代理对象来代替对真实对象(real object)的访问,这样就可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对 ...

  9. 浅谈Spring中JDK动态代理与CGLIB动态代理

    前言 Spring是Java程序员基本不可能绕开的一个框架,它的核心思想是IOC(控制反转)和AOP(面向切面编程).在Spring中这两个核心思想都是基于设计模式实现的,IOC思想的实现基于工厂模式 ...

  10. 静态代理,JDK动态代理,Cglib动态代理详解

    目录 一.代理模式 二.静态代理 三.动态代理 3.1 JDK动态代理 3.2 Cglib动态代理 四.两种动态代理区别 一.代理模式 代理模式(Proxy Pattern)是程序设计中的一种设计模式 ...

最新文章

  1. 逆向工程破解苹果监控iPhone图片的算法:原来iOS14.3上就有了
  2. session_unset()和session_destroy()的区别
  3. 打算尝试瑜伽,看是否能解决长期困扰的胃痛问题
  4. android最大json,Android:解析大型JSON文件
  5. char* 和char[] 内存分配的区别(转载)
  6. c++ mysql 配置文件_C++操作数据库写入到json配置文件中
  7. 向MFC应用程序添加控制台窗口
  8. Design pattern
  9. iOS5 UIKit新特性
  10. 简述C#中IO的应用 RabbitMQ安装笔记 一次线上问题引发的对于C#中相等判断的思考 ef和mysql使用(一) ASP.NET/MVC/Core的HTTP请求流程...
  11. torchtext用法
  12. 公文排版字体要求以及印制要求
  13. 8种排序算法(Java实现)
  14. 软件测试--移动应用主要针对软测比赛(教程)
  15. 【C语言】斐波那契数列
  16. NCConverter for mac(NCM音乐格式文件转换器)
  17. android添加nfc门禁卡,IOS14nfc怎么添加门禁卡?NFC门禁卡教程[多图]
  18. C++实现的简单k近邻算法(K-Nearest-Neighbour,K-NN)
  19. 红豆熟了之后会生出什么呢?
  20. Arnold 渲染设置 - Main - Sampling 采样设置

热门文章

  1. php淘口令,淘口令使用说明
  2. Python数据预处理--Gensim构建语料词典
  3. 扩展卡尔曼滤波算法——基本原理及举例(python实现radar数据滤波)
  4. ss导航java宝典_ss导航绅士宝典app下载-ss导航绅士宝典百度网盘官方版下载v1.1.0-七度网...
  5. 很详细的讲解什么以及为什么是卷积(Convolution)!
  6. 谈一下MVVM 框架
  7. 封装SIP和SOIC有什么区别
  8. Qt报错:qt.qpa.xcb: QXcbConnection: XCB error: 8 (BadMatch).....
  9. 后端学习 Java 面向指挥官的操作系统
  10. VMware搭建docker mastodon