动态代理技术

关于SpringAop及其动态代理技术 Spring AOP 提供了一种强大的机制来模块化横切关注点,使得代码更加清晰和易于维护。通过使用切面、通知和切点,开发者可以专注于业务逻辑,而将横切关注点分离出来,提高代码的模块化和可重用性。 阅读详情


代理技术作用,之一增强方法

第一种方式cglib(不需要接口,只需要普通方法)

/**
 * 一个生产者
 */
public class Producer {

    /**
     * 销售
     * @param money
     */
    public void saleProduct(float money){
        System.out.println("销售产品,并拿到钱:"+money);
    }

    /**
     * 售后
     * @param money
     */
    public void afterService(float money){
        System.out.println("提供售后服务,并拿到钱:"+money);
    }
}
/**
 * 模拟一个消费者
 */
public class Client {

    public static void main(String[] args) {
        final Producer producer = new Producer();

        /**
         * 动态代理:
         *  特点:字节码随用随创建,随用随加载
         *  作用:不修改源码的基础上对方法增强
         *  分类:
         *      基于接口的动态代理
         *      基于子类的动态代理
         *  基于子类的动态代理:
         *      涉及的类:Enhancer
         *      提供者:第三方cglib库
         *  如何创建代理对象:
         *      使用Enhancer类中的create方法
         *  创建代理对象的要求:
         *      被代理类不能是最终类
         *  create方法的参数:
         *      Class:字节码
         *          它是用于指定被代理对象的字节码。
         *
         *      Callback:用于提供增强的代码
         *          它是让我们写如何代理。我们一般都是些一个该接口的实现类,通常情况下都是匿名内部类,但不是必须的。
         *          此接口的实现类都是谁用谁写。
         *          我们一般写的都是该接口的子接口实现类:MethodInterceptor
         */
        Producer cglibProducer = (Producer)Enhancer.create(producer.getClass(), new MethodInterceptor() {
            /**
             * 执行北地阿里对象的任何方法都会经过该方法
             * @param proxy
             * @param method
             * @param args
             *    以上三个参数和基于接口的动态代理中invoke方法的参数是一样的
             * @param methodProxy :当前执行方法的代理对象
             * @return
             * @throws Throwable
             */
            @Override
            public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
                //提供增强的代码
                Object returnValue = null;

                //1.获取方法执行的参数
                Float money = (Float)args[0];
                //2.判断当前方法是不是销售
                if("saleProduct".equals(method.getName())) {
                    returnValue = method.invoke(producer, money*0.8f);
                }
                return returnValue;
            }
        });
        cglibProducer.saleProduct(12000f);
    }
}

第二种方式Proxy(需要接口实现类)

/**
 * 一个生产者
 */
public class Producer implements IProducer{

    /**
     * 销售
     * @param money
     */
    public void saleProduct(float money){
        System.out.println("销售产品,并拿到钱:"+money);
    }

    /**
     * 售后
     * @param money
     */
    public void afterService(float money){
        System.out.println("提供售后服务,并拿到钱:"+money);
    }
}
/**
 * 对生产厂家要求的接口
 */
public interface IProducer {

    /**
     * 销售
     * @param money
     */
    public void saleProduct(float money);

    /**
     * 售后
     * @param money
     */
    public void afterService(float money);
}
/**
 * 模拟一个消费者
 */
public class Client {

    public static void main(String[] args) {
        final Producer producer = new Producer();

        /**
         * 动态代理:
         *  特点:字节码随用随创建,随用随加载
         *  作用:不修改源码的基础上对方法增强
         *  分类:
         *      基于接口的动态代理
         *      基于子类的动态代理
         *  基于接口的动态代理:
         *      涉及的类:Proxy
         *      提供者:JDK官方
         *  如何创建代理对象:
         *      使用Proxy类中的newProxyInstance方法
         *  创建代理对象的要求:
         *      被代理类最少实现一个接口,如果没有则不能使用
         *  newProxyInstance方法的参数:
         *      ClassLoader:类加载器
         *          它是用于加载代理对象字节码的。和被代理对象使用相同的类加载器。固定写法。
         *      Class[]:字节码数组
         *          它是用于让代理对象和被代理对象有相同方法。固定写法。
         *      InvocationHandler:用于提供增强的代码
         *          它是让我们写如何代理。我们一般都是些一个该接口的实现类,通常情况下都是匿名内部类,但不是必须的。
         *          此接口的实现类都是谁用谁写。
         */
       IProducer proxyProducer = (IProducer) Proxy.newProxyInstance(producer.getClass().getClassLoader(),
                producer.getClass().getInterfaces(),
                new InvocationHandler() {
                    /**
                     * 作用:执行被代理对象的任何接口方法都会经过该方法
                     * 方法参数的含义
                     * @param proxy   代理对象的引用
                     * @param method  当前执行的方法
                     * @param args    当前执行方法所需的参数
                     * @return        和被代理对象方法有相同的返回值
                     * @throws Throwable
                     */
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        //提供增强的代码
                        Object returnValue = null;

                        //1.获取方法执行的参数
                        Float money = (Float)args[0];
                        //2.判断当前方法是不是销售
                        if("saleProduct".equals(method.getName())) {
                            returnValue = method.invoke(producer, money*0.8f);
                        }
                        return returnValue;
                    }
                });
        proxyProducer.saleProduct(10000f);
    }
}
动态代理技术与RPC架构解析 对于多体应用,由于各服务部署在不同机器,服务间的调用免不了网络通信过程,服务消费方每调用一个服务都要写较多网络通信相关的代码,不仅复杂而且极易出错。若能实现一种机制,使得开发者能够像调用本地服务一般便捷地调用远程服务,同时对网络通信等底层细节保持透明,那么这将极大地释放程序员的开发负担,显著提升开发效率与生产力。比如,服务消费方在执行helloService.hi(“Panda”)时,实质上调用的是远端的服务。 阅读详情

相关推荐

IEEE Access投稿全流程解析:从初次提交到最终接收的完整指南

本文详细解析了IEEE Access期刊从初次投稿到最终接收的全流程,包括ORCID注册、论文投稿七步法、回稿再投流程及最终版提交等关键步骤。特别强调了4-6周快速同行评审的特点,为研究者提供了一份实用的投稿指南,帮助高效完成IEEE Access期刊投稿。

weixin_29273849的博客 915

动态代理详解

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

???? 1920

别再让C盘爆红了!手把手教你将Anaconda虚拟环境迁移到其他盘(附权限问题解决)

本文详细指导如何将Anaconda虚拟环境从C盘迁移到其他驱动器,解决C盘空间不足问题。通过conda config命令和直接修改.condarc配置文件两种方法,确保环境迁移顺利进行,同时提供权限问题解决方案和长期维护技巧,帮助用户高效管理虚拟环境。

weixin_42525289的博客 421

都2024年了,还有人不懂动态代理么?

静态代理和动态代理都反映了一个代理模式,代理模式是一种经典的设计模式,常用于为其他对象提供一种代理或占位符,以限制对它的访问,充当访问对象的中介。就好比平时我们租房,会和中介进行沟通,中介带我们去看房,中介又与房东保持联系,但房东不会带我们看房。JDK代理与Cglib代理对比Cglib实现的动态代理是基于ASM字节码生成框架实现的,使用字节码技术生成代理类,在JDK1.6之前比使用Java反射效率要高一点。

沉迷写代码的程序猿的博客 971

使用patchelf与独立glibc解决Cursor/VSCode远程开发环境兼容性问题

本文针对Cursor/VSCode远程开发连接Ubuntu 18.04、CentOS 7等老系统时因GLIBC版本过低导致的兼容性问题,提供了一套安全高效的解决方案。核心思路是通过编译独立的glibc-2.28环境,并利用patchelf工具修改远程服务端的node可执行文件,使其优先使用新版glibc,从而在不升级系统库、不影响系统稳定性的前提下,完美解决远程开发环境“罢工”的难题。

weixin_28835789的博客 567

SAP MTO实战:从销售订单到生产订单的精准触发与配置详解

本文深入解析SAP系统中按订单生产(MTO)模式的核心流程与配置。详细阐述了如何通过精准配置物料主数据策略组、需求类型及计划策略(如策略50),实现从销售订单自动触发生产订单的完整链路。文章结合实战案例,指导用户打通销售与生产环节,并提供了关键事务代码与常见问题排查指南,助力企业实现以销定产,优化库存与成本控制。

weixin_29300931的博客 215

常用的动态代理技术

JDK 代理 : 基于接口的动态代理技术·:利用拦截器(必须实现invocationHandler)加上反射机制生成 一个代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理,从而实现方法增强 CGLIB代理: 基于父类的动态代理技术:动态生成一个要代理的子类,子类重写要代理的类的所有不是 final的方法。在子类中采用方法拦截技术拦截所有的父类方法的调用,顺势织入横切逻辑,对方法进行 增强 JDK动态代理方式 CGLIB动态代理方式 ..

qq_38977566的博客 476

避开这些坑!RK3588安卓系统内置输入法的正确姿势(含.mk文件修改指南)

本文详细解析了在RK3588安卓系统定制中预置第三方输入法的完整流程与关键避坑指南。重点涵盖APK签名、Android.mk文件编写、系统默认输入法配置(使用adb ime list命令获取服务名)以及SeLinux策略适配等核心步骤,并指出RK3566/RK3568等兄弟平台的通用性与差异点,帮助开发者实现稳定、深度的系统集成。

tgb34567890的博客 437

Java基础加强第六讲 动态代理技术(上)——动态代理入门

动态代理简单入门动态代理技术在实际开发中用到的非常多,所以有必要详解一下这门技术。这门技术非常难,因此学起来还是比较困难的,但我们不怕困难,定要啃下这块硬骨头。 要想理解动态代理这门技术,必须明确两个概念: 代理对象存在的价值:主要用于拦截对真实业务对象的访问。 代理对象有什么方法? 一般来说,真实业务对象具有什么方法,那么代理对象就会具备相应的方法。 现在要生成某一个对象的代理对象,这个代理对

李阿昀的博客 3413

Carla-编译CarlaUE4提示HoloLens.Automation项目缺少Windows程序集?

编译CarlaUE4提示HoloLens.Automation项目缺少Windows程序集?不妨看看这个!

DSK_981029的博客 2573

uni-app - 修改默认端口,H5 项目控制台运行出来的 IP 地址的默认端口号(H5 项目运行后控制台,修改项目运行到内置浏览器默认 8080 端口号)

uni-app运行到H5修改默认端口号,uni-app如何修改默认端口,uni-app修改默认端口,uni-app本地运行修改调试已上线微信H5项目,请问在UNIAPP的H5运行调试时候的IP是否可以自己设置固定,uni-app开发环境,如何设置h5服务器的端口,uni-app如何修改默认端,uni-app修改默认端口,uni-app指定端口号,uni-app-修改H5项目控制台运行出来的IP地址的默认端口号(H5项目运行后控制台,修改项目运行到内置浏览器默认8080端口号)

🏆 前端领域优质创作者 9887

常用动态代理介绍

大家好今天给大家介绍一下常用的几种动态代理,希望能从这篇文章中了解一些spring中动态代理的基本原理。   一、背景介绍 何为代理: 假设这样一个场景,你的公司是一家软件公司,你是一位软件工程师。客户带着需求来找公司显然不会直接找你谈,而是去找商务谈,此时客户会认为商务就代表公司 客户(调用者)——》商务(代理对象)——》软件工程师(真实对象) 显然客户是通过商务去访问软件工程师的,...

weixin_41910244的博客 1260

【QNX+Android虚拟化方案】136 - QNX 侧 Coredump 文件解析

【QNX+Android虚拟化方案】136 - QNX 侧 Coredump 文件解析

|~~~热爱生活、努力学习的小伙汁~~~| 1911

java动态代理技术

【代码】java动态代理技术。

qq_57667629的博客 243

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

CGLib动态代理和JDK动态代理Demo、ASM技术尝鲜

本文主要介绍CGLib和JDK动态代理的使用,不对源码进行深入分析。CGLib主要使用ASM技术生成新的代理类,通过FastClass索引技术能够快速的执行代理方法,底层使用回调MethodInterceptor,重写invoke方法;而JDK动态代理时通过反射的技术与代理逻辑绑定,反射执行的效率相对低一些,底层使用InvocationHandler,重写Invoke方法即可。

m0_45164511的博客 1387

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

JDK动态代理技术

JDK动态代理技术 1.首先要有接口 public interface UserService { public void a(int x, int y); public void b(); public void c(); } 2.该接口要有实现类(动态代理的目标类) // 目标类 public class UserServiceTarget implements U...

bryant_yang的博客 471

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

【Java】动态代理技术

静态代理:在编译期确定代理类,即我们需要手动编写代理类。在这种情况下,代理类与目标类需要实现相同的接口。虽然静态代理能够增强方法,但它不够灵活,因为每次新增接口或方法都需要编写新的代理类。动态代理:在运行时动态创建代理类。Java动态代理主要基于接口进行代理,使用类和接口。动态代理通过反射机制实现,不需要手动编写代理类,能够动态地为接口生成代理类。// 定义用户服务接口// 实现接口的具体类@OverrideSystem.out.println("添加用户: " + name);

u013675821的博客 2919

java中动态代理技术的两种实现方式

       动态代理是使用反射和字节码,在运行期间创建指定接口或类的子类以及它的实例对象的一项技术,通过这个技术可以对代码进行无侵入式的增强。java中动态代理技术有两种实现方式:JDK原生动态代理、CGLIB动态代理 一、JDK原生动态代理        这一种主要是针对有接口实现的情况,它的底层是创建接口的实现代理类,实现扩展功能。也就是我们要增强的这个类实现了某

编码小波的博客 1766

8.代理模式_2:动态代理:什么是动态代理???常见哪两种动态代理技术???

跟汤老师学Java笔记:动态代理 完成:第一遍 1.什么是动态代理? 代理类是程序运行期间由JVM根据反射机制动态生成的,自动生成代理类和代理对象 所谓动态是指在程序运行前不存在代理类的class文件,代理类和委托类的关系是在程序运行时确定 动态代理的实现 2.常见哪两种动态代理技术? jdk动态代理技术:只适用于实现了接口的类,使用 java.lang.reflect.Proxy cglib动态代理技术:可用于没有实现任何接口的类,需要使用第三方jar包(通过继承实现的,让代理类继承目标类) 注:如果一个

ADbyCool的博客 553

SpringAop中的jdk动态代理技术和cglib动态代理技术

1、Spring Aop中使用到了动态代理技术,对于jdk动态代理,要求必须代理接口,底层是java的反射机制,对于类,使用cglib字节码增强来动态代理2、设计模式中简单的代理模式实现3、jdk动态代理的实现方法import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang...

有梦想的咸鱼的博客 391

JAVA代理技术:JDK技术动态代理和CGLIB技术动态代理代码示例

文章目录JDK技术动态代理和CGLIB技术动态代理代码示例一、JDK技术动态代理代码示例二、CGLIB技术动态代理代码示例三、了解代理模式四、JDK动态代理技术分析五、CGLIB动态代理技术分析 JDK技术动态代理和CGLIB技术动态代理代码示例 一、JDK技术动态代理代码示例 创建接口 public interface DreamCgOne { void sing(String name); } 创建接口实现类 public class DreamCgOneImpl implements

给时光以文明 695

Spring AOP 核心的技术之一:动态代理

如果目标类实现了接口Spring AOP默认使用 JDK 动态代理。这是 Java 标准库提供的代理方式,并且通常认为基于接口的代理是更优的面向对象实践。Spring 会创建一个实现了目标类所实现的所有接口的新代理类。这个代理类持有对原始目标对象的引用,并通过 InvocationHandler 机制将增强逻辑(AOP Advice)织入。你得到的代理 Bean 可以被赋值给它所实现的任何接口类型,但不能直接赋值给原始的目标实现类类型(除非强制类型转换,但通常不推荐,且可能失败)。如果。

2301_80197997的博客 1084

关于springAop底层动态代理技术解释

本文主要讲述Spring的AOP(面向切面编程)底层基于动态代理技术实现的原理,主要讲述计算逻辑原理

2401_87837211的博客 1063

看完Java的动态代理技术——Pythoner笑了

Java的动态代理常用来包装原始方法调用,用于增强或改写现有方法的逻辑,它在Java技术领域被广为使用,在阿里的Sofa RPC框架序列化中你能看到它的身影,Hibern...

shellquery的博客 93
上一篇: SpringAOP需要解决的问题
下一篇: SpringAOP的使用
RestartJava
博客等级 码龄7年 1粉丝 53原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值