Cglib动态代理

2023-11-07

       JDK实现动态代理需要实现类通过接口定义业务方法,对于没有接口的类,如何实现动态代理呢,这就需要CGLib了。CGLib采用了非常底层的字节码技术,其原理是通过字节码技术为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑。JDK动态代理与CGLib动态代理均是实现Spring AOP的基础。

委托类:

package com.reflect.proxy;

public class GunDog1 {
	
	public void info() {
		System.out.println("我是一只美丽的猎狗");
	}
	
	public void run() {
		System.out.println("我非常的奔跑迅速");
	}

}

通用的方法:

package com.reflect.proxy;

public class DogUtil {
	
	
	public void method1(){
		System.out.println("=====模拟第1个通用方法======");
	}
	
	public void method2(){
		System.out.println("=====模拟第2个通用方法======");
	}

}

代理类“:

interceptor(Object obj,Method method,Object[] args ,MethodProxy proxy)  是CGLib定义的Interceptor接口的方法,它拦截所有目标类方法的调用 ,obj表示目标类的实例;method为目标类方法的反射对象;args为方法的动态入参;而proxy为代理类方法实例.

package com.reflect.proxy;

import java.lang.reflect.Method;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

/**
 * 使用cglib动态代理
 * @author yulei
 *
 */
public class GunDogCglib implements MethodInterceptor {
	private Object target;
	
	/**
	 * 创建代理对象
	 */
	public Object getInstance(Object target){
		this.target=target;
		Enhancer enhancer=new Enhancer();
		//设置要创建子类的类
		enhancer.setSuperclass(this.target.getClass());
		//回调方法
		enhancer.setCallback(this);
		//通过字节码技术动态创建子类实例
		return enhancer.create();
	}
	
	
	@Override
	public Object intercept(Object object, Method method, Object[] args,
			MethodProxy methodProxy) throws Throwable {
	     DogUtil du=new DogUtil();
		//执行DogUtil中的method1
		 du.method1();
	   Object result=  methodProxy.invokeSuper(object, args);
		//执行DogUtil中的Method2
		du.method2();
		
		return result;
	}
}

测试类:

package com.reflect.proxy;

public class TestCglib {
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		GunDogCglib dogCglib=new GunDogCglib();
		GunDog1 gunDog1=(GunDog1) dogCglib.getInstance(new GunDog1());
		gunDog1.run();
	}

}
输出:

=====模拟第1个通用方法======
我非常的奔跑迅速
=====模拟第2个通用方法======


  CGLib创建的动态代理对象性能比JDK创建的动态代理对象的性能高不少,但是CGLib在创建代理对象时所花费的时间却比JDK多得多,所以对于单例的对象,因为无需频繁创建对象,用CGLib合适,反之,使用JDK方式要更为合适一些。同时,由于CGLib由于是采用动态创建子类的方法,对于final方法,无法进行代理


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Cglib动态代理 的相关文章

随机推荐

  • Vivado-FIFO Generator

    很全很详细的FIFO Generator IP核的使用规则 FIFO Generator IP核的使用 1 概述 1 最大支持500M 2 支持三种接口 Native interface FIFOs AXI Memory Mapped in
  • ansible lookup例子

    lookup 读取csv 通过lookup方式 将用户密码把独立到credentials csv文件中 credentials csv Credentials File Hostname Password web server Passw0
  • shell脚本输入密码

    平时在控制台输入指令如 sudo ssh ftp或者修改admin权限的文件时候都会要求输入password 但是在she ll脚本运行过程中该如何交互实现自动输入密码呢 下面总结三种实现方法 一 重定向 用重定向方法实现交互的前提是指令需
  • Linux 基础语法 -2

    如果我们以后再Linux当中 写了一些命名 导致程序我们不能进行操作了 如这个死循环 他就会一直输出 hello Linux 我们就使用 ctrl c 来终止因为程序或者指令异常 而导致我们无法进行指令输入 通配符 它的意思是所有 比如我们
  • python合并音频Couldn‘t find ffprobe or avprobe解决办法

    1 cmd指令pip install pydub 安装pydub库 当然 还需要ffmpeg库 pip install ffmpeg安装或者下载ffmpeg https ffmpeg zeranoe com builds 解压安装后将路径复
  • 解析C++中不能重载为友元函数的四个运算符

    C 规定有四个运算符 gt 不可以是全局域中的重载 即不能重载为友员函数 这是为什么呢 现在先说说赋值运算符 的重载 C 规定赋值运算符 只能重载为类的非静态成员函数 而不可以重载为类的友元函数 不能重载为类的静态成员应该比较容易理解 因为
  • @SpyBean 和 @MockBean 区别,以及@Spy 和 @Mock的区别

    2019独角兽企业重金招聘Python工程师标准 gt gt gt spy对象和mock对象的两点区别 Spy 和 Mock的 两点 区别 SpyBean 和 MockBean 的两点区别 1 默认行为的不同 对于未指定mock的方法 sp
  • centos7 安装/卸载 任意版本的mariadb(mysql)

    mysql官网的链接 https downloads mysql com archives community 安装 mariadb是mysql的一个开源分支 安装mariadb后使用的命令依旧是mysql的 因此这里博主使用centos7
  • 彻底解决SLF4J的日志冲突的问题

    今天公司同事上线时发现 有的机器打印了日志 而有的机器则一条日志也没有打 以往都是没有问题的 因此猜测是这次开发间接引入新的日志jar包 日志冲突导致未打印 排查代码发现 系统使用的是SLF4J框架打印log4j2的日志 查看系统中引入的j
  • openssl库HMAC使用 undefined reference to `HMAC_CTX_new‘

    原因 由于使用的openssl库版本的问题HMAC CTX HMAC CTX new void 为OpenSSL 1 1 0后开始引入的函数 老的库要使用void HMAC CTX init HMAC CTX ctx 老的 HMAC库函数
  • Unix and perl primer for Biologists - Part1 :Unix - Learning the Essentials - Reading Notes(U25-U32)

    U25 Less is more you can look at files in Unix the less command lets you view but not edit text files When you are using
  • Java自学之路-马士兵老师

    JAVA自学之路 一 学会选择 为了就业 不少同学参加各种各样的培训 决心做软件的 大多数人选的是java 或是 net 也有一些选择了手机 嵌入式 游戏 3G 测试等 那么究竟应该选择什么方向呢 我的意见是 不要太过相信各种培训机构或是抢
  • 毕业论文中去掉Latex超链接颜色

    毕业论文中去掉Latex超链接 目录 颜色文献颜色 方法一 隐藏链接 hypersetup hidelinks 方法二 修改链接颜色 hypersetup colorlinks true linkcolor black
  • 剑指offer_第19题_顺时针打印矩阵_Python

    题目描述 输入一个矩阵 按照从外向里以顺时针的顺序依次打印出每一个数字 例如 如果输入如下4 X 4矩阵 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1 2 3 4 8 12 16 15 1
  • react 创建新页面_React 初学者教程2: 创建第一个 React 应用

    通过前面一章的学习 我们已经了解了有关 React 的基本信息 以及它是如何帮助我们轻松创建即使是最复杂的用户界面 但是对于 React 提供的所有精彩来说 刚开始学习它可不是最简单的事情 React 的学习曲线相当陡峭 里面大大小小的障碍
  • 论文理解【Offline RL】——【BooT】Bootstrapped Transformer for Offline Reinforcement Learning

    标题 Bootstrapped Transformer for Offline Reinforcement Learning 文章链接 Bootstrapped Transformer for Offline Reinforcement L
  • switch语句解决ATN取款机问题

    include
  • Parasoft C/C++test更新至v10.4.2版本,静态分析性能增强!

    Parasoft C C test是针对 C C 开发的综合性代码质量保障工具 有效提高开发团队工作效率和软件质量 1月29日 MISRA和AUTOSAR联盟宣布合并两项最受欢迎的安全关键C 开发编码标准 澄清了两个关键问题 将更新AUTO
  • A Survey on VQA: Datasets and Approaches

    VQA综述类论文的阅读 VQA综述类论文的阅读 A Survey on VQA Datasets and Approaches 介绍 数据集 图像类数据集 Balanced VQA Datasets of Statistical Figur
  • Cglib动态代理

    JDK实现动态代理需要实现类通过接口定义业务方法 对于没有接口的类 如何实现动态代理呢 这就需要CGLib了 CGLib采用了非常底层的字节码技术 其原理是通过字节码技术为一个类创建子类 并在子类中采用方法拦截的技术拦截所有父类方法的调用