CGLIB动态代理模式与jdk动态代理模式的区别是: 目标代理类不需要实现接口,同样也可以实现代理。

直接看一个简单的cglib应用,看他是如何实现代理的。

第一步,新建一个maven项目,并引入cglib依赖:

 <dependency><groupId>cglib</groupId><artifactId>cglib</artifactId><version>3.1</version></dependency>

第二步,新建一个目标类,名为HelloWorld:

package com.hand.proxy.cglib;public class HelloWorld {public void sayHello() {System.out.println("CGLIB动态代理模式!");}}

第三步,创建代理类,里面主要有2个方法,一个为获取代理的实例方法,另一个为需要重写的方法,此类需要实现MethodInterceptor接口,该接口很简单,此包含一个方法intercept:

public interface MethodInterceptor extends Callback
{/*** All generated proxied methods call this method instead of the original method.* The original method may either be invoked by normal reflection using the Method object,* or by using the MethodProxy (faster).* @param obj "this", the enhanced object* @param method intercepted Method* @param args argument array; primitive types are wrapped* @param proxy used to invoke super (non-intercepted method); may be called* as many times as needed* @throws Throwable any exception may be thrown; if so, super method will not be invoked* @return any value compatible with the signature of the proxied method. Method returning void will ignore this value.* @see MethodProxy*/    public Object intercept(Object obj, java.lang.reflect.Method method, Object[] args,MethodProxy proxy) throws Throwable;}

在创建实例前,我们需要使用一个叫Enhancer的对象,此对象用来创建代理对象,设置目标类为超类后的同时需要回调当前类:

package com.hand.proxy.cglib;import java.lang.reflect.Method;import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;public class CGLIBExampleProxy implements MethodInterceptor{/*** 指定cglib代理模式的代理类*/private Object target;public Object bind(Object target) {this.target=target;Enhancer enhancer=new Enhancer();//设置超类方法enhancer.setSuperclass(this.target.getClass());//设置一个回调方法,用来设置哪个类为代理类,this表示当前类为代理类enhancer.setCallback(this);//创建代理对象return enhancer.create();}public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {System.out.println("CGLIB代理前");Object object=proxy.invokeSuper(obj, args);System.out.println("CGLIB代理后");return object;}}

intercept方法的几个参数说明:
obj:表示目标对象

method:表示当前调度的方法,这里指的是HelloWorld类里面的sayHello()方法

args:表示执行方法的参数列表

MethodProxy: 表示执行目标方法的代理对象

验证结果:

package com.hand.proxy.cglib;public class CGLIBTest {public static void  main(String[]args) {//1.获取代理对象CGLIBExampleProxy proxy=new CGLIBExampleProxy();//2.获取代理对象HelloWorld hello=(HelloWorld)proxy.bind(new HelloWorld());//3.执行代理方法hello.sayHello();}
}

输出结果为:

CGLIB代理前
CGLIB动态代理模式!
CGLIB代理后

以上就是cglib代理模式的一个简单实现。通过与jdk动态代理模式的比较发现, cglib模式不需要目标类实现接口,即可实现代理。

jdk动态代理

CGLIB动态代理模式详解相关推荐

  1. 静态代理与动态代理模式详解(优缺点分析,实例分析,读源码必备)

    1.代理模式 (1)概念 代理就是帮别人做事情,如:工厂的中介,中介负责为工厂招收工人,那么中介就是工厂的代理:客户通过商家购买东西,商家向厂家购买货物,商家就是工厂的代理 在开发中存在a类需要调用c ...

  2. JDK和cglib动态代理原理详解

    AOP的基础是Java动态代理,了解和使用两种动态代理能让我们更好地理解 AOP,在讲解AOP之前,让我们先来看看Java动态代理的使用方式以及底层实现原理. 转自https://www.jiansh ...

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

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

  4. 代理模式详解(静态代理和动态代理的区别以及联系)

    原文链接:https://www.cnblogs.com/takumicx/p/9285230.html 1. 前言 代理模式可以说是生活中处处可见.比如说在携程上定火车票,携程在这里就起到了一个代理 ...

  5. 动态代理机制详解(JDK 和CGLIB,Javassist,ASM)

    2019独角兽企业重金招聘Python工程师标准>>> 在运行时期可以按照Java虚拟机规范对class文件的组织规则生成对应的二进制字节码.当前有很多开源框架可以完成这些功能,如A ...

  6. java的动态代理机制详解

    2019独角兽企业重金招聘Python工程师标准>>> 参考资料 1.java的动态代理机制详解 转载于:https://my.oschina.net/Howard2016/blog ...

  7. 【Spring AOP】静态代理设计模式、Spring 动态代理开发详解、切入点详解(切入点表达式、切入点函数)

    AOP 编程 静态代理设计模式 1. 为什么需要代理设计模式 2. 代理设计模式 名词解释 代理开发的核心要素 静态代理编码 静态代理存在的问题 Spring 动态代理开发 搭建开发环境 Spring ...

  8. Java动态代理机制详解(JDK 和CGLIB,Javassist,ASM)

    class文件简介及加载 Java编译器编译好Java文件之后,产生.class 文件在磁盘中.这种class文件是二进制文件,内容是只有JVM虚拟机能够识别的机器码.JVM虚拟机读取字节码文件,取出 ...

  9. Spring AOP理论 +代理模式详解

    目录 1.理解AOP 1.1.什么是AOP 1.2.AOP体系与概念 1.3.Spring AOP 通知的执行顺序 2.代理模式 2.1.静态代理 2.2.静态代理的缺点 3.动态代理 JDK 动态代 ...

  10. 第四篇、代理模式详解(三种)

    一.代理模式 代理模式的定义:代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用.通俗的来讲代理模式就是我们生活中常见的中介. 二.代理模式的实现方式 1.静态代理 在代理之前,所有 ...

最新文章

  1. Android ListView 点击item改变item的背景颜色(ListView实现光标移动)
  2. ACE反应器(Reactor)模式
  3. jQuery UI在Server 2008 IE8下DatePicker问题修复
  4. Add a All Document Folder
  5. 联系随笔2---在tomcat服务器上发布servlet应用程序
  6. mybatis更新时间字段_你以为把Mybatis型处理器了解了,就不会“暴雷”了!
  7. 收藏的一些github开源项目,在这里记录一下
  8. Android图像办理组件
  9. WINDOWS XP下驱动开发环境设置(DDK+VC6.0)
  10. 昨天晚上全新打造N无线AP
  11. ViewPage2和Fragment以及Tablayout使用
  12. 计算机指令的操作码和地址,操作码和地址码
  13. 三维立体地图开发项目书
  14. 专访京东孙海波:大牛架构师养成记及电商供应链中区块链技术的应用(转)...
  15. ll和 amp amp c语言,ll 和 java
  16. 内涵一下我参加过的那些竞赛。
  17. LibreOJ #6198.谢特 后缀数组+并查集+trie启发式合并
  18. 基于自适应调整权重和搜索策略的鲸鱼优化算法
  19. 练手必备,20个Python实战项目含源代码
  20. 反射(三) 笔记

热门文章

  1. 周公解梦|做梦的解释|鬼压床|为什么会做梦
  2. [Linux]关于Transmission下载服务器的搭建与配置
  3. JavaScript怎么安装_WebStrom 2019安装教程
  4. C#控制台应用程序的输入输出
  5. Android 应用签名的创建
  6. 手机无线电驾驶与马歇尔·麦克卢汉的哲学
  7. 万特电能表接线仿真系统 软件_电工学习PLC和接线入门 之 无中生有(软件仿真)...
  8. linux 系统硬件信息检测工具,Linux硬件检测工具
  9. android手机安装windows系统,安卓手机原来还可以这样安装windows系统,你还不知道吗?...
  10. 最新 2022维达纸业AI面试真题题库