动态代理

JDK动态代理和CGLIB动态代理 在SpringAOP中基于动态代理实现功能的增强,也就是动态的生成代理类,在代理类中织入增强的逻辑然后调用目标对象的方法。动态代理中用的比较多的两种:JDK动态代理、CGLIB动态代理。 JDK动态代理 使用JDK的java.lang.reflect.Proxy类的newProxyInstance方法实现的代理。 用一个测试接口看下具体实现: public interface JdkProxyDemoService { void queryTrs(); } @Service public 阅读详情

原文地址:https://www.jianshu.com/p/46d5c64e0459

代理代理,就是找个人代替你做你该做的事,分为静态代理和动态代理,一个一个说

准备工作

我们先假设一种场景,打游戏,我们创建一个游戏人物去打游戏,让一个代理帮我们打游戏
1,建立一个游戏人物的抽象类

public interface GamePlayer {
    void login(String user,String password);
    void killBoss();
    void upgrade();
}

2,游戏人物的实体类

public class GamePlayerA implements GamePlayer{

    private String name;

    public GamePlayerA(String name){
        this.name = name;
    }


    @Override
    public void login(String user, String password) {
        System.out.println(name + " 登录成功" + " 登录名为" + user);
    }

    @Override
    public void killBoss() {
        System.out.println(this.name + "在打怪");
    }

    @Override
    public void upgrade() {
        System.out.println(this.name + "恭喜你 升级了");
    }
}

下面开始实现代理

静态代理

静态代理是在编译时期就把代理实现了
1,将被代理对象构造注入,代码如下

public class GamePlayerProxy implements GamePlayer{

    private GamePlayer gamePlayer;

    public GamePlayerProxy(GamePlayer gamePlayer){
        this.gamePlayer = gamePlayer;
    }

    @Override
    public void login(String user, String password) {
        this.gamePlayer.login(user,password);
    }

    @Override
    public void killBoss() {
        this.gamePlayer.killBoss();
    }

    @Override
    public void upgrade() {
        this.gamePlayer.upgrade();
    }
}

2,调用

public class Main {
    public static void main(String[] args){
        GamePlayer gamePlayer = new GamePlayerA("张三");
        GamePlayerProxy gamePlayerProxy = new GamePlayerProxy(gamePlayer);
        gamePlayerProxy.login("zhangsan","password");
        gamePlayerProxy.killBoss();
        gamePlayerProxy.upgrade();
    }
}

还是挺简单的,就是把被代理对象构造注入,然后在内部调用被代理对象,这里我们可以做的更极致一点就是把被代理对象都隐藏起来让高层组件只能接触到代理对象

动态代理

在运行时创建代理类,这里要注意我们使用java中的动态代理实际上就是创建了在运行时动态创建了一个

public class Main {
    public static void main(String[] args){
        GamePlayer gamePlayer = new GamePlayerA("张三");
        GamePlayer gamePlayerProxy = (GamePlayer) Proxy.newProxyInstance(gamePlayer.getClass().getClassLoader(),
                gamePlayer.getClass().getInterfaces(),
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        return method.invoke(gamePlayer,args);
                    }
                });
        gamePlayerProxy.login("zhangsan","password");
        gamePlayerProxy.killBoss();
        gamePlayerProxy.upgrade();
    }
}

我们在使用的时候大部分都是使用的动态代理,通过反射调用目标方法,在代理中增加非业务性代码,比如打点啊,数据统计之类的

jdk动态代理和cglib动态代理对比 JDK 动态代理:只代理接口(interface),无法代理类。它使用java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口来实现动态代理。 CGLIB 动态代理:可以代理类和接口。它通过生成目标类的子类来创建代理对象,因此可以代理没有实现接口的类。 阅读详情

相关推荐

使用OpenCV进行3D重建:详细指南

3D重建是计算机视觉领域的一项关键技术,它能够从二维图像中恢复出场景的三维结构。这项技术在机器人视觉、增强现实和3D建模等多个领域都有广泛的应用。在本篇技术博客中,我们将详细介绍如何使用OpenCV这一流行的计算机视觉库来实现3D重建。我们将逐步探讨整个过程,包括相机标定、特征点提取与匹配、立体校正、深度图计算以及最终的三维重建。3D重建是一个复杂的过程,涉及多个步骤和多种算法。OpenCV提供了强大的工具来支持这一过程,从相机标定到特征点提取与匹配,再到立体校正和深度图计算,最后实现三维重建。

weixin_41544125的博客 1315

Java中动态代理的两种方式JDK动态代理和cglib动态代理以及区别

上篇介绍了一下静态代理:Java中的代理模式——静态代理以及分析静态代理的缺点 也分析了一下静态代理的缺点: 1、由于静态代理中的代理类是针对某一个类去做代理的,那么假设一个系统中有100个Service,则需要创建100个代理类 2、如果一个Service中有很多方法需要事务(增强动作),发现代理对象的方法中还是有很多重复的代码 3、由第一点和第二点可以得出:静态代理的重用性不强 那怎...

曹举的个人博客 2万+

深入浅出:UE4类型系统完整构建过程详解

UE4的类型系统是一个复杂但设计精巧的架构,它通过静态代码生成和运行时构建的完美配合,实现了强大的反射功能。理解这个过程不仅有助于解决开发中的问题,也能让你更好地利用UE4的各种高级特性。就像建造一栋大楼需要经过设计、备料、框架、装修、验收等多个阶段,UE4类型系统的构建也是一个多阶段、精细化的过程。每个阶段都有其特定的职责,共同协作完成从源代码到运行时对象的转换。

m0_45371381的博客 911

Java两种动态代理JDK动态代理和CGLIB动态代理

目录 代理模式 JDK动态代理 cglib动态代理 测试 代理模式 代理模式是23种设计模式的一种,他是指一个对象A通过持有另一个对象B,可以具有B同样的行为的模式。为了对外开放协议,B往往实现了一个接口,A也会去实现接口。但是B是“真正”实现类,A则比较“虚”,他借用了B的方法去实现接口的方法。A虽然是“伪军”,但它可以增强B,在调用B的方法前后都做些其他的事情。Spring AOP...

主要作为个人的笔记用,Not For Everyone。 14万+

Oracle入门——基础语法篇

ROWID是Oracle中的一个伪列,用于唯一标识数据库中的每一行。在查询中,可以使用ROWID来定位和操作特定的行,例如,删除特定的行或更新特定的行。在Oracle中,子查询是指嵌套在另一个查询内部的查询语句,它可以作为主查询的一部分,用于提供额外的过滤条件、计算或数据源。在Oracle中,连接查询是通过使用JOIN子句将两个或多个表中的数据合并在一起,以获取满足特定条件的结果集。在Oracle数据库中,ROWID和ROWNUM都是用于对行进行标识和定位的伪列,它们在查询中的使用有一些不同之处。

麦当当的博客 3089

数学:箭头符号→(to)都表示什么意义?

数学符号“→”在不同领域有不同含义:在逻辑中表示“蕴含”(p→q);在函数中表示映射关系(f:A→B);在极限中表示变量趋近(x→a);在推导过程中表示推理方向(A→B)。此外,它也可能用于向量表示或数列趋势。其具体含义需结合上下文判断,核心应用场景包括逻辑运算、函数定义、极限分析和数学推导等。

shunzi2016的博客 5563

【Java】万字解读Java的动态代理(JDK原生动态代理、CGLIB动态代理)

动态代理在Java中有着广泛的应用,比如 Spring AOP、RPC 远程调用、Java 注解对象获取、日志、用户鉴权、全局性异常处理、性能监控,甚至事务处理等。JDK原生动态代理和CGLIB 动态代理。

✈ 正在努力 の 寒江(StudiousTiger) ✌ 呐 ✈ 1万+

智算中心建设全流程指南:从规划到落地

智算中心的建设是一个复杂而系统的过程,涉及选址、立项、办理相关手续、设计、土建、机电安装、调试、验收等多个环节。每个环节都需要充分考虑各种因素,并注意相关的事项,以确保智算中心的顺利建设和高效运行

数据中心全生命周期价值管理 3395

JDK动态代理、Cglib动态代理及Spring AOP

Java中的JDK动态代理是一种通过反射机制生成代理对象的技术,使得我们能够在运行时动态地创建某个接口的代理类,而无需手动编写实现类。JDK动态代理通常用于横切关注点(如日志、事务管理、安全性等)在方法调用前后进行处理,而不需要修改目标类的源代码。

意疏的博客 6385

【2024保研经验帖】中科院信工所夏令营经验分享

中科院信工所夏令营经验分享,信工所夏令营据说只要报了就能进,这个是不是真的尚不清楚,不过qq群里有八九百个人,也属实可怕。招生老师说我们这届夏令营招200-300个左右,于是又开始惶惶不安。 夏令营时期都是线上进行,先是每个科室进行线上招生宣讲,然后报名第一志愿部门和第二志愿部门,不同部门的考核是不同的。有的部门只要求英语面试和综合面试,有的部门除了面试还需要机试,而有的部门除了这些还需要笔试。

m0_63002183的博客 4489

从入门到精通:dirmap 高级 Web 目录扫描实战指南

本文提供了一份从环境搭建到高级配置的dirmap Web目录扫描实战指南。详细解析了工具安装、核心配置文件dirmap.conf的深度调优,包括递归扫描、四种扫描模式(字典、爆破、爬虫、Fuzz)的实战应用,并演示了分阶段资产发现的完整工作流程,帮助安全人员高效发现隐藏目录与敏感文件。

rnn9storyteller的博客 479

JDK动态代理和CGLIB动态代理有什么区别?

JDK动态代理和CGLIB动态代理有什么区别?

水w的博客 8014

荣耀Magic 6 dToF LiDAR Android阵营全球第一首发

40X30分辨率的BSI SPAD小面阵,帧率达到60帧,搭配多传感器融合算法, 可产生足够的稠密点云,为应用设备提供可靠的距离传感。在手机消费电子方案中,dToF LiDAR技术不仅提升了手机的功能和用户体验,还为手机厂商提供了差异化的竞争优势。随着技术的不断进步和市场的快速发展,我们可以期待未来dToF LiDAR技术将在手机领域发挥更大的作用,为用户带来更多创新和便捷的功能。增强现实(AR)体验:通过dToF LiDAR提供的高精度深度信息,手机可以更准确地放置虚拟物体在现实世界的表面上。

致力于lidar应用开发 19万+

什么是动态代理?动态代理有哪些应用?如何编写动态代理案例

什么是动态代理? 当我们需要给某个类或者接口中的方法添加一些额外的功能比如日志、事务的时候,可以通过创建一个代理类来实现这些功能;该代理类既包含了原有类的完整功能,同时在这些功能的基础上添加了其他的逻辑。这个代理类不是事先定义好的,而是动态生成的,比较灵活; 有几种动态代理 1.java动态代理 java动态代理有个缺点就是要被代理的类必须实现一个接口,否则没法代理 2.cgli...

qq_34357351的博客 4709

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

java动态代理:jdk动态代理和cglib动态代理

java动态代理

记录学习点滴 3317

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

实例理解JDK动态代理和Cglib动态代理及其区别

实例理解JDK动态代理和Cglib动态代理及其区别 深入理解设计模式之代理模式 代理商代理化妆品生产理解JDK动态代理 代理商代理汽车制造理解Cglib动态代理

Duktig的博客 6064

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

【动态代理】动态代理学习

代理类中方法调用的实例赋值成功。1.ClassLoader loader,被代理类的类加载器,以确保代理类和被代理类位于相同的类加载上下文中。图中哈希码687是是目标对象实例引用,2d6是代理对象实例引用,代理对象实例内部持有687,通过代理类的方法调用间接操作这个目标对象。3.InvocationHandler h,代理类方法调用的处理器,当调用代理对象的方法时,会转交给这个类中的invoke方法执行。3.代理类,实现业务所需方法对应的接口,添加目标对象的业务,并添加增强行为/额外操作。

m0_46363490的博客 1136

JDK动态代理与CGLIB动态代理

设计模式之代理模式 下面假设一个常见的场景,假如你有一个法国的朋友叫Aice,有一天你想要购买一瓶法国香奈儿的香水,这种香水只在法国销售。你找到你的朋友Alice,请求她帮忙购买一瓶香奈儿的香水,你的朋友Alice于是乎就找到香奈儿的销售店购买了一瓶法国香奈儿的香水,并将香水交给了你。 在上面这个例子当中,你想要购买法国香水,但是无法直接向香奈儿供应商购买,只能通过中间人(Alice)购买,这就是我们生活中比较常见的代理模式。我们假设有一天,你突然想要一瓶法国红酒,但是由于Alice本身并不具备购买红

weixin_43529092的博客 3323

【动态代理】—— JDK和cglib的动态代理

概述 设计模式中有一个代理模式,它为其他对象提供一种代理以控制对这个对象的访问。 关于代理模式可以参考:【每天一个java设计模式(七)】 - 代理模式:https://blog.youkuaiyun.com/weixin_43598687/article/details/122072282 代理模式是指的静态代理。使用静态代理很容易就完成了对一个类的代理操作。但是静态代理的缺点也暴露了出来:由于代理只能为一个类服务,如果需要代理的类很多,那么就需要编写大量的代理类,比较繁琐。 而动态代理可以在程序运行期间,在不修改源

1+1=王的博客 4463

java的动态代理

jdk动态代理cglib动态代理jdk动态代理是由java内部的反射机制来实现的,cglib动态代理底层则是借助asm来实现的。反射机制在生成类的过程中比较高效,而asm在生成类之后的相关执行过程中比较高效(可以通过将asm生成的类进行缓存,这样解决asm生成类过程低效问题)。jdk动态代理的应用前提是目标类必须基于统一的接口。因此,jdk动态代理有一定的局限性,cglib这种第三方类库实现的动态代理应用更加广泛,且在效率上更有优势。

m0_53077601的博客 5356

Java动态代理、CGLIB动态代理

本文涉及代理模式、静态代理、动态代理、CGLIB动态代理、JDK动态代理源码分析等内容。

十八岁讨厌编程的博客 2066

动态代理详解

在传统的代理模式中,客户端通过 ProxyObject 调用 RealObject 类的方法,同时在代理类中封装了其他方法,可以处理一些其他问题。如果按照这种方法使用代理模式,那么真实主题角色必须是事先存在的,并将其作为代理对象的内部成员属性。如果一个真实主题角色必须对应一个代理主题角色,这将导致系统中类的个数急剧增加,因此需要想办法减少系统中类的个数,此外,如何在事先不知道主题角色的情况下使用代理主题角色,这都是动态代理需要解决的问题。

???? 1920

JDK动态代理 VS Cglib动态代理

提到了动态代理就不得不提到静态代理和动态代理的区别了。动态代理和静态代理是两种常见的代理模式,在软件开发中经常被用来实现对象间的间接访问。它们之间的主要区别在于代理对象的生成时机和方式。静态代理和动态代理都是为了实现对象间的间接访问,通过代理对象来控制对目标对象的访问。静态代理在编译时就已经确定了代理对象,而动态代理是在运行时生成代理对象。静态代理需要为每个被代理类创建一个代理类,而动态代理可以动态地为多个类创建代理对象。动态代理相对于静态代理更加灵活,但实现机制相对复杂。

m0_68570169的博客 1403

JDK 动态代理和 CGLIB 动态代理

JDK 动态代理和 CGLIB 动态代理静态代理JDK 动态代理CGLIB 动态代理总结 我们在阅读一些 Java 框架的源码时,基本上常会看到使用动态代理机制,它可以无感的对既有代码进行方法的增强,使得代码拥有更好的拓展性。 通过从静态代理、JDK 动态代理、CGLIB 动态代理来进行本文的分析。 静态代理 静态代理就是在程序运行之前,代理类字节码.class就已编译好,通常一个静态代理类也只代...

@龙猫的博客 3711

Java动态代理之JDK动态代理

在介绍动态代理前,我们需要先搞清楚什么是代理模式。代理模式是一种很常见的设计模式,简而言之就是通过创建一个代理对象,让调用方来访问代理对象,从而实现对真实对象的保护或增强。Spring AOP、Mockito测试框架生成的mock或spy对象都是代理模式的例子。其实,代理并不是一个编程中才有的概念,生活中委托中介帮忙租房子,或者找律师打官司,都可以看作代理模式的应用。这样我们就完成了代理模式的编写,下面可以写个测试类看看效果输出结果为。

weixin_47372115的博客 868
上一篇: 建造者模式
下一篇: 原型模式
杨殿生
博客等级 码龄10年 11粉丝 77原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值