当前位置: 首页 > news >正文

cglib动态代理实现

         cglib动态代理也是一种常用的实现,与jdk动态代理相比有许多不同之处, cglib通过继承目标类,生成子类作为代理。它无需接口,直接覆盖父类方法进行增强,因此无法代理final类或final方法。下面是一个简单的实现案例。

 1.目标类

    static class Target{public void foo(){System.out.println("target foo");}}

         目标类是一个类而非对象,而且方法和类上都不能用final修饰。

2.代理类创建

 Target proxy = (Target)Enhancer.create(Target.class, (MethodInterceptor) (p, method, args, methodProxy) -> {System.out.println("before...");Object invoke = method.invoke(target, args);System.out.println("after...");return invoke;});

        代理类的创建是通过Enhancer对象创建,其中需要传入两个参数,一个是目标对象,另一个是MethodInterceptor对象。该对象是Callback对象的子类。

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//package org.springframework.cglib.proxy;import java.lang.reflect.Method;public interface MethodInterceptor extends Callback {Object intercept(Object var1, Method var2, Object[] var3, MethodProxy var4) throws Throwable;
}

        MethodInterceptor对象的创建需传入四个参数,第一个是代理对象,第二个是Method,第三个是args方法参数,第四个是MethodProxy代理对象,与第一个参数有所不同。整体方法调用代码如下:

package com.example.demo2;import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;/*** @author zhou* @version 1.0* @description TODO* @date 2025/10/26 17:21*/
public class CglibProxyDemo {static class Target{public void foo(){System.out.println("target foo");}}public static void main(String[] param){Target target = new Target();Target proxy = (Target)Enhancer.create(Target.class, (MethodInterceptor) (p, method, args, methodProxy) -> {System.out.println("before...");Object invoke = method.invoke(target, args);System.out.println("after...");return invoke;});proxy.foo();}
}

输出结果:

3.目标类的调用的三种方式

 Object invoke = method.invoke(target, args);

        这是一种通过反射的方式调用目标类的方法,除此之外还有别的方法可以使用,一般来说反射调用都会影响性能。下面的方法可以不用反射调用目标方法。使用了methodProxy代理调用。

 Object invoke = methodProxy.invoke(target, args);

       结果如下:

       methodProxy代理调用的另一种实现方式可以不用传入目标对象,代理的是本身,如下所示:

Object invoke = methodProxy.invokeSuper(p, args);

     同样达到了一样的效果:

http://www.dtcms.com/a/533940.html

相关文章:

  • 1.4.4 大数据方法论与实践指南-成本治理(省钱)
  • 自己的公司怎么做网站wordpress注册插件中文版
  • 中华建设杂志网站记者绍兴网站建设报价
  • 做家装的网站有哪些如何做网络推广
  • mysql存储过程和函数
  • 青海省高等级公路建设管局网站免费windows10云主机下载
  • 西安市建网站给单位做网站需要多少钱
  • 网站建设实践鉴定铜川泰士公馆建设网站
  • 电子商务网站有哪些内容上海网站开发团队
  • 长春电商网站建设wordpress js上传图片
  • 中国工商注册网官网淄博网站建设优化珍云
  • 营销型网站建设怎么做营销网站建设温州哪里有网站优化
  • 构建稳定数据管道:淘宝商品详情 API 的接入、监控与错误处理
  • Redis下载安装教程与使用,以及基础知识的应用
  • 哪个网站可以做视频外链企业网站建设的一般原则
  • 网站 盈利自己做个网站要多少钱
  • Gorm(十)计数 / 存在性
  • SAP 维护视图变式(Maintenance View Variants)
  • 苏州建设公司网站上海的公司地址
  • 景安网站备案要多久免费网址导航网站建设
  • 杨浦区建设小学网站首页WordPress有意思的代码特效
  • STM32F103C8T6_SPI完整教程
  • 使用蓝图组件
  • 哈尔滨网站建设培训班技术网站模版
  • 网站服务器和直播服务器一样吗深圳网站设计官网
  • 大型网站如何做别名夏津建设局网站
  • 20-Java-面向对象-static
  • 株洲网站建设优化网站建设方案书含合同
  • 网站页面设计稿做网站构架
  • 2019/12 JLPT听力原文 问题四