CGLIB动态代理模式详解
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)概念 代理就是帮别人做事情,如:工厂的中介,中介负责为工厂招收工人,那么中介就是工厂的代理:客户通过商家购买东西,商家向厂家购买货物,商家就是工厂的代理 在开发中存在a类需要调用c ...
- JDK和cglib动态代理原理详解
AOP的基础是Java动态代理,了解和使用两种动态代理能让我们更好地理解 AOP,在讲解AOP之前,让我们先来看看Java动态代理的使用方式以及底层实现原理. 转自https://www.jiansh ...
- cglib动态代理jar包_代理模式详解:静态代理+JDK/CGLIB 动态代理实战
1. 代理模式 代理模式是一种比较好的理解的设计模式.简单来说就是 我们使用代理对象来代替对真实对象(real object)的访问,这样就可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标 ...
- 代理模式详解(静态代理和动态代理的区别以及联系)
原文链接:https://www.cnblogs.com/takumicx/p/9285230.html 1. 前言 代理模式可以说是生活中处处可见.比如说在携程上定火车票,携程在这里就起到了一个代理 ...
- 动态代理机制详解(JDK 和CGLIB,Javassist,ASM)
2019独角兽企业重金招聘Python工程师标准>>> 在运行时期可以按照Java虚拟机规范对class文件的组织规则生成对应的二进制字节码.当前有很多开源框架可以完成这些功能,如A ...
- java的动态代理机制详解
2019独角兽企业重金招聘Python工程师标准>>> 参考资料 1.java的动态代理机制详解 转载于:https://my.oschina.net/Howard2016/blog ...
- 【Spring AOP】静态代理设计模式、Spring 动态代理开发详解、切入点详解(切入点表达式、切入点函数)
AOP 编程 静态代理设计模式 1. 为什么需要代理设计模式 2. 代理设计模式 名词解释 代理开发的核心要素 静态代理编码 静态代理存在的问题 Spring 动态代理开发 搭建开发环境 Spring ...
- Java动态代理机制详解(JDK 和CGLIB,Javassist,ASM)
class文件简介及加载 Java编译器编译好Java文件之后,产生.class 文件在磁盘中.这种class文件是二进制文件,内容是只有JVM虚拟机能够识别的机器码.JVM虚拟机读取字节码文件,取出 ...
- Spring AOP理论 +代理模式详解
目录 1.理解AOP 1.1.什么是AOP 1.2.AOP体系与概念 1.3.Spring AOP 通知的执行顺序 2.代理模式 2.1.静态代理 2.2.静态代理的缺点 3.动态代理 JDK 动态代 ...
- 第四篇、代理模式详解(三种)
一.代理模式 代理模式的定义:代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用.通俗的来讲代理模式就是我们生活中常见的中介. 二.代理模式的实现方式 1.静态代理 在代理之前,所有 ...
最新文章
- Android ListView 点击item改变item的背景颜色(ListView实现光标移动)
- ACE反应器(Reactor)模式
- jQuery UI在Server 2008 IE8下DatePicker问题修复
- Add a All Document Folder
- 联系随笔2---在tomcat服务器上发布servlet应用程序
- mybatis更新时间字段_你以为把Mybatis型处理器了解了,就不会“暴雷”了!
- 收藏的一些github开源项目,在这里记录一下
- Android图像办理组件
- WINDOWS XP下驱动开发环境设置(DDK+VC6.0)
- 昨天晚上全新打造N无线AP
- ViewPage2和Fragment以及Tablayout使用
- 计算机指令的操作码和地址,操作码和地址码
- 三维立体地图开发项目书
- 专访京东孙海波:大牛架构师养成记及电商供应链中区块链技术的应用(转)...
- ll和 amp amp c语言,ll 和 java
- 内涵一下我参加过的那些竞赛。
- LibreOJ #6198.谢特 后缀数组+并查集+trie启发式合并
- 基于自适应调整权重和搜索策略的鲸鱼优化算法
- 练手必备,20个Python实战项目含源代码
- 反射(三) 笔记
热门文章
- 周公解梦|做梦的解释|鬼压床|为什么会做梦
- [Linux]关于Transmission下载服务器的搭建与配置
- JavaScript怎么安装_WebStrom 2019安装教程
- C#控制台应用程序的输入输出
- Android 应用签名的创建
- 手机无线电驾驶与马歇尔·麦克卢汉的哲学
- 万特电能表接线仿真系统 软件_电工学习PLC和接线入门 之 无中生有(软件仿真)...
- linux 系统硬件信息检测工具,Linux硬件检测工具
- android手机安装windows系统,安卓手机原来还可以这样安装windows系统,你还不知道吗?...
- 最新 2022维达纸业AI面试真题题库