JDK动态代理机制

JDK1.8 动态代理机制及源码解析 1.静态代理 核心思想:代理对象通过持有需要被代理类的实例,实现代理方式。 参考链接: http://www.cnblogs.com/mengdd/archive/2013/01/30/2883468.html2.动态代理 a) jdk 动态代理 Proxy, 核心思想:通过实现被代理类的所有接口,生成一个字节码文件后构造一个代理对象,通过持有反射构造被代 阅读详情

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
 * JDK动态代理
 */
public class JdkProxyTest {
    //定义一个接口
    public interface Hello {
        public void sayHello();
    }
    //接口实现
    public static class HelloImpl implements Hello {
        public void sayHello() {
            System.out.println("Hello world!!");
        }
    }
    //第一种采用构造方法模式
    public static class JdkInvocationHandler1 implements InvocationHandler {
        //真实对象
        private Object target;
        public JdkInvocationHandler1(Object target) {
            this.target = target;
        }
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            System.out.println("------进入代理之前-------------");
            Object obj = method.invoke(target, args);
            System.out.println("------进入代理之后-------------");
            return obj;
        }
    }
    //第二种采用普通方法模式
    public static class JdkInvocationHandler2 implements InvocationHandler {
        //真实对象
        private Object target;
        /**
         * 第一步:建立代理对象与真实对象的代理关系,并返回代理对象
         * @param target 真实对象
         * @return 代理对象
         */
        public Object bind(Object target) {
            this.target = target;
            return Proxy.newProxyInstance(target.getClass().getClassLoader(),
                    target.getClass().getInterfaces(), this);

         /***

通过 Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(), this);建立了代理对象与真实对象的关系,第一个参数是类加载器,这里我们传入的就是HelloImpl的类加载器,第二个参数是动态代理对象下挂那些接口,这里就是Hello接口,这个参数的类型是Class<?>[],第三个参数是实现代理方法逻辑的实现类,也就是invoke方法的实现类,所以这里就是this。

通过invoke(Object proxy, Method method, Object[] args)实现了代理逻辑,第一个参数是代理对象,也就是bind方法返回的对象,第二个参数是当前调度的方法,args是调度方法的参数。这里其实是用到了JAVA反射方法的机制,实现代理对象到真实对象方法的调用。

       */
        }
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            System.out.println("------进入代理之前-------------");
            Object obj = method.invoke(target, args);
            System.out.println("------进入代理之后-------------");
            return obj;
        }
    }
    public static void main(String[] args) {
        /**
         *     1.通过实现InvocationHandler接口来自定义自己的InvocationHandler;
            2.通过Proxy.getProxyClass获得动态代理类
            3.通过反射机制获得代理类的构造方法,方法签名为getConstructor(InvocationHandler.class)
            4.通过构造函数获得代理对象并将自定义的InvocationHandler实例对象传为参数传入
            5.通过代理对象调用目标方法
         */
        //生成动态代理类
        Class<?> clazz = Proxy.getProxyClass(Hello.class.getClassLoader(), Hello.class);
        try {
            //获得代理类的构造函数,并传入参数类型InvocationHandler.class
            Constructor<?> constructor = clazz.getConstructor(InvocationHandler.class);
            //通过构造函数来创建动态代理对象,将自定义的InvocationHandler实例传入
            Hello hello = (Hello) constructor.newInstance(new JdkInvocationHandler1(new HelloImpl()));
            //通过代理对象调用目标方法
            hello.sayHello();
        } catch (Exception e) {
            e.printStackTrace();
        }
        /**
         * Proxy类中还有个将2~4步骤封装好的简便方法来创建动态代理对象,
         * 其方法签名为:newProxyInstance(ClassLoader loader,
         *             Class<?>[] instance, InvocationHandler h)
         */
        Hello helloImpl1=(Hello)Proxy.newProxyInstance(HelloImpl.class.getClassLoader(), HelloImpl.class.getInterfaces(), new JdkInvocationHandler1(new HelloImpl()));
        //通过代理对象调用目标方法
        helloImpl1.sayHello();
        /**---------------------------------------------------------------------*/
        JdkInvocationHandler2 jdkInvocationHandler2=new JdkInvocationHandler2();
        Hello helloImpl=(Hello) jdkInvocationHandler2.bind(new HelloImpl());
        //通过代理对象调用目标方法
        helloImpl.sayHello();
    }
}

输出------进入代理之前-------------
Hello world!!
------进入代理之后-------------
------进入代理之前-------------
Hello world!!
------进入代理之后-------------
------进入代理之前-------------
Hello world!!
------进入代理之后-------------

 

做形态学方法的团队_“设计形态学”与“第三自然” 文/邱松(清华大学 美术学院)摘要:“设计形态学”是基于“形态学”研究的设计基础学科。“形态”既是该学科研究的主体,又是与其它学科相连接的“纽带”。实际上,不管是供养我们的地球家园,还是神秘莫测的浩瀚宇宙,均由数量纷繁、千姿百态的“形态”构筑而成。形态通常被分成两大类:一类是源于“第一自然”的“自然形态”;另一类是来自“第二自然”的“人造形态”。而这两类形态正是“设计形态学”研究的两条... 阅读详情

相关推荐

OPC与AI智能体集成实战:一人公司的技术栈构建与避坑指南

1. 先搞清楚“一人公司”和“AI工具”到底在解决什么问题 最近看到不少关于“裸辞搞OPC一人公司”和“AI时代骗局”的讨论,结合搜索热词里高频出现的 openclaw 、 AI编程 、 OPC ,我觉得有必要把这里面的水搅一搅,说点实在的。 首先得拆开看。标题里混了三个东西: 一人公司 、 OPC/OpenClaw 、 AI培训 。它们被放在一起讨论“骗局”,但本质上解决的是不同层面的问题。 一人公司 ,或者说个人工作室、独立开发者模式,核心是 用最小化团队(甚至一个人)去承接项目、开发产品或提供服务 。

weixin_29038345的博客 320

JDK动态代理

【代码】JDK动态代理。

qq_45270066的博客 287

最新Mamba环境配置教程:从CUDA到causal-conv1d的完整安装流程

本文提供最新Mamba环境配置教程,涵盖从CUDA到causal-conv1d的完整安装流程。针对深度学习领域的长序列处理需求,详细指导如何正确配置CUDA工具链、安装PyTorch及关键依赖causal-conv1d,解决常见报错问题,并验证mamba-ssm集成效果。

bush的博客 417

JDK动态代理解析,InvocationHandler的第一个参数的解析

详解JDK动态代理,InvocationHandler中invoke()方法的第一个参数的意义,终于弄懂了

这是我的笔记本,记录学习历程,分享学习经验,菜鸡一枚,感谢支持! 1108

手把手教你设计STM32的JTAG电路:从原理图到PCB布局(含JLINK连接详解)

本文详细介绍了STM32的JTAG电路设计全流程,从核心原理、接口规范到PCB布局布线技巧,特别包含JLINK调试器的连接与配置方法。通过信号滤波、上拉配置和防反接保护等关键设计要点,帮助开发者构建稳定可靠的JTAG调试环境,提升嵌入式开发效率。

weixin_29159441的博客 388

SAP 深入理解库存

当 某个期间发生货物移动的时候,系统在更新mard数据的之前(这个表是实时更新的),会检查此笔业务过账期间和mard里对应记录的期间是否一致,也就是 看这是不是本期间第一笔移动。其二,我们不能保证这定期的作业的确定性,硬件维护、系统性能都可能使这预定的“时刻”出现偏差,如果某一次没能抓取该时刻的库存,对整个报表来说,是数据的缺失;中,当某一期间(Period)的第一项操作更新了物料数量或价值,则SAP系统会向表MBEWH写入一条记录,以第一项操作之前的余额、价格控制为标准。这对于业务数据量大的。

matinal 當冬夜漸暖 。公众号:matinal 3620

实现jdk动态代理-InvocationHandler(简单易懂)

实现jdk动态代理-InvocationHandler(简单易懂)

fujinlei2017的博客 574

数字孪生实战:如何用Blender+Unity快速搭建未来工厂3D模型(附资源包)

本文提供了一套利用Blender进行三维建模,再结合Unity构建虚拟仿真环境的实用方案,旨在帮助中小型制造企业低成本、高效率地搭建未来工厂数字孪生原型系统。文章详细介绍了从数据规划、模型优化到场景构建、逻辑仿真与数据对接的全流程,并附有资源包,助力技术团队快速实现从静态展示到动态交互的数字孪生应用。

weixin_29191669的博客 337

jdk动态代理中的Proxy类与中间层InvocationHandler的深入研究总结

一:jdk动态代理的逻辑介绍 动态生成的代理类里面每一个方法的实现都是调用InvocationHandler的invoke方法,在invoke()方法中,有三个参数,分别是Object,Method以及args数组,三个参数都是代理类Proxy调用时传入的。第一个参数Proxy传入的是当前的this对象;第二个参数Proxy传入的是需要被执行的Method对象;第三个参数则是Method对象需要的参数。因此,代理类只需要拿到对应的Method对象及相应参数,就可以通过InvocationHandler的i

m0_57713282的博客 1427

Experion PKS系列开发:I_O模块_ExperionPKS与第三方I-O模块的集成

通过上述步骤,可以成功将第三方I/O模块集成到Honeywell Experion PKS系统中,实现对现场设备的监视和控制。集成过程中需要注意选择合适的第三方模块,配置正确的通信参数,编写正确的控制逻辑,并进行充分的测试,以确保系统的稳定性和可靠性。不同的通信协议(如Modbus、Profibus、Ethernet/IP、CANopen、OPC UA)有其独特的配置和编程方法,但总体流程相似。在实际应用中,根据项目需求选择合适的协议和模块,可以有效提高系统的灵活性和适应性。

zhubeibei168的博客 1099

Thor芯片部署

英伟达Jetson Thor芯片性能分析与应用现状 摘要:英伟达最新发布的Jetson Thor芯片基于Blackwell架构,官方宣称AI算力达2070TFLOPS(FP4),较前代Orin提升7.5倍,配备14核Arm CPU和128GB内存。然而实际量产版算力缩水至700TOPS,且因4nm制程良率问题多次延期至2025-2026年交付。该芯片支持FP4/FP8量化、Transformer引擎等先进特性,适用于自动驾驶、机器人等边缘AI场景,但受供应链限制,国内厂商倾向自研方案。开发者可通过JetPa

xiaomu_347的博客 430

jdk动态代理原理源码深度分析

这里写自定义目录标题简单实例运行原理分析动态代理精华分析类Proxy-创建动态代理对象 简单实例 接口: package com.example.demo0423.proxy; public interface ProxyTest { void send(String msg); } 实现类: package com.example.demo0423.proxy; public class ProxyTestImpl implements ProxyTest{ @Override

qq_28940607的博客 1222

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

基于 JDK 的动态代理机制

基于 JDK 的动态代理机制 『动态代理』其实源于设计模式中的代理模式,而代理模式就是使用代理对象完成用户请求,屏蔽用户对真实对象的访问。 举个最简单的例子,比如我们想要「FQ」访问国外网站,因为我们并没有墙掉所有国外的 IP,所以你可以将你的请求数据报发送到那些没有被屏蔽的国外主机上,然后你通过配置国外主机将请求转发到目的地并在得到响应报文后转发回我们国内主...

Chen Rong的博客 257

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Java动态代理机制之JDK动态代理

前言 代理模式(Proxy Pattern)是23种常用的面向对象软件的设计模式之一,作用是为其他对象提供一种代理以控制对这个对象的访问,直白说就是中间商或代购 如图,client发起请求到接口,正常是通过接口实现类impl来调用方法完成请求,但是增加了代理类后,可以直接用proxy的实例来调用interface的实现类的方法,并且可以增加额外的功能。 为什么要增加一层代理类呢,有两个优点: 隐藏和保护接口实现类, 控制对接口实现类对象的直接访问 可以增加新的功能实现,提高了系统的可扩展性 而

611

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

浅谈JDK动态代理机制

转自:微点阅读https://www.weidianyuedu.com Java中代理的实现一般分为三种:JDK静态代理、JDK动态代理以及CGLIB动态代理。在Spring的AOP实现中,主要应用了JDK动态代理以及CGLIB动态代理。但是本文着重介绍JDK动态代理机制,CGLIB动态代理后面会接着探究。 代理一般实现的模式为JDK静态代理:创建一个接口,然后创建被代理的类实现该接口并且实现该接口中的抽象方法。之后再创建一个代理类,同时使其也实现这个接口。在代理类中持有一个被代理对象的引用,而..

ysds20211402的博客 450

java的反射机制和JDk的动态代理

文章参考(必须先看文章): Java 动态代理作用是什么? - 知乎 浅谈JDK动态代理(中) - 知乎 Java基础篇:反射机制详解_张维鹏的博客-优快云博客_java反射机制原理详解 对象的创建过程 new创建对象的过程: JVM申请一块内存空间 JVM调用类私有的构造器并传入ClassLoader(类加载器) 类加载器加载对应类的字节码,JVM创建Class对象 首先,在很多初学者的印象中,类和对象的关系是这样的: 虽然知道源代码经过javac命令编译后会在磁盘中得到字节码文件.

m0_46205209的博客 711

动态代理机制:jdk与cglib

前言 按照代理类的创建时期,代理类可分为两种: –静态代理类:由程序员创建或由特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。 –动态代理类:在程序运行时,运用反射机制动态创建而成。 而动态代理又有cglib代理和jdk代理之分。 适用范围: 1、如果目标对象实现了接口,一般情况下采用JDK的动态代理 2、如果目标对象实现了接口,可以强制使用CGLIB实现AOP 3、如果目标对象没有实现了接口,必须采用CGLIB库 区别: 1、JDK动态代理利用反射机制生成一个实现代

a_un_l的博客 213

Java JDK动态代理机制

最近写了一个简单的ORM数据库框架,需要动态实现接口,用到了动态代理,这里记录一下动态代理的实现。 在Java动态代理机制中,最重要的是一个接口(java.lang.reflect.InvocationHandler)和一个类(java.lang.reflect.Proxy)。 1、java.lang.reflect.InvocationHandler 接口 InvocationHandler 接...

Be Like 539

Java 动态代理机制:JDK和CGLib

Java 动态代理机制的出现,使得 Java 开发人员不用手工编写代理类,只要简单地指定一组接口及委托类对象,便能动态地获得代理类。代理类会负责将所有的方法调用分派到委托对象上反射执行,在分派执行的过程中,开发人员还可以按需调整委托类对象及其功能,这是一套非常灵活有弹性的代理框架。在线阅读【Java动态代理机制详解】pdf文件Spring AOP简介AOP(Aspect Orient Progra...

wenlin_xie的专栏 284

JDK与CGLib动态代理的生成机制解析

正确说法:JDK和CGLib动态代理在程序运行期间动态生成代理类字节码,代理对象在首次调用创建方法时实例化。核心价值:通过运行时字节码操作实现方法拦截,为AOP、事务管理等场景提供技术基础。性能建议:高频调用场景优先选择CGLib,接口明确且简单场景使用JDK代理。

m0_53626105的博客 1130

深度剖析JDK动态代理机制

摘要 相比于静态代理,动态代理避免了开发人员编写各个繁锁的静态代理类,只需简单地指定一组接口及目标类对象就能动态的获得代理对象。 代理模式 使用代理模式必须要让代理类和目标类实现相同的接口,客户端通过代理类来调用目标方法,代理类会将所有的方法调用分派到目标对象上反射执行,还可以在分派过程中添加"前置通知"和后置处理(如在调用目标方法前校验权限,在调用完目标方法后打印日志等)等...

JacksonKing的专栏 317

Java动态代理机制——JDK

动态代理机制是Spring AOP编程的原理基础。

u014230168的专栏 547

jdk的动态代理机制生成代理对象

jdk的动态代理机制生成代理对象 public class MyTarget implements InvocationHandler { private Object target; public Object createProxy(Object target){ this.target=target; //1.类加载器 使用和目标对象一样的类加载器 //2.目标对象的接口 //3.代理对象执...

Zzx235000的博客 725

聊聊JDK动态代理和CGlib动态代理,AOP代理机制是怎么回事?代理模式详解

摘要: 代理模式通过引入代理对象间接访问目标对象,控制访问并扩展功能。分为静态代理(手动增强方法,灵活性差)和动态代理(运行时生成代理类)。静态代理需为每个目标类单独创建代理类,动态代理则更灵活,包括JDK动态代理(基于接口)和CGLIB动态代理(直接代理类)。示例展示了静态代理的实现步骤,动态代理通过运行时动态生成字节码实现高效扩展。

先做到 再看见 2071

【Java进阶-深入讲解基于JDK的动态代理机制】

众所周知相比于静态代理,动态代理避免了开发人员编写各个繁锁的静态代理类,下面这篇文章主要给大家介绍了关于基于JDK的动态代理机制的相关资料,文中通过图文以及示例代码介绍的非常详细,需要的朋友可以参考下

Japathy 124
上一篇: 设计模式(八)——建造者模式
下一篇: java反射
farmering
博客等级 码龄15年 18粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值