自定义JDK动态代理类

模拟JDK动态代理实现 JDK动态代理 在JDK1.3以后提供了动态代理的技术,允许开发者在运行期创建接口的代理实例。在Sun刚推出动态代理时,还很难想象它有多大的实际用途,现在动态代理是实现AOP的绝好底层技术。 JDK的动态代理主要涉及java.lang.reflect包中的两个类:Proxy和InvocationHandler。其中InvocationHandler是一个接口,可以通过实现该接口定义横切逻辑,并 阅读详情

为什么要自定义动态代理类?

动态代理可以给目标类方法增加额外功能(功能增强)而不改变原目标类的代码,如添加日志
如果改变目标类方法很有可能使 业务方法 与 非业务方法(增加日志功能) 冗杂在一起,不符合开闭原则,从而使代码耦合度提高,并且不利于维护(详细可以看下面的例子)

JDK动态代理

Jdk动态代理要求目标对象必须实现接口

jdk动态代理实现步骤

  1. 创建目标类,SomeServiceImpl目标类,给它的doSome,doOther增加输出时间,事务。

  2. 创建InvocationHandler接口的实现类,在这个类实现给目标方法增加功能。

  3. 使用jdk中类Proxy,创建代理对象,实现创建对象的能力。

首先写一个需要实现动态代理功能的功能接口(如下有两个方法)

public interface SomeService {
    void doThis();

    void doThat();
}

写一个接口实现类(这是业务方法)

public class DoSomeService implements SomeService{
    public void doThis(){
        System.out.println("I am doThis");
    }

    public void doThat(){
        System.out.println("I am doThat");
    }
}

写一个日志工具类(这是非业务方法)

public class ServiceTool {
    private ServiceTool(){}

    public static void doLog(){
        System.out.println("现在的时间是:"+ new Date());
    }

    public static void doCommit(){
        System.out.println("事物已提交...");
    }
}

如果没有动态代理,代码很有可能这样

public class DoSomeService implements SomeService{
    public void doThis(){
        ServiceTool.doLog();                    //非业务代码
        System.out.println("I am doThis");    
        ServiceTool.doCommit();                 //非业务代码
    }

    public void doThat(){
        ServiceTool.doLog();                    //非业务代码
        System.out.println("I am doThat");
        ServiceTool.doCommit();                 //非业务代码
    }
}

缺点 

虽然对于工具类的方法已经进行了很好的封装,但是对于业务代码和非业务代码还是冗杂在一起,如果后期需求需要修改,那么 doThis 和 doThat 方法又需要整个重新修改,很明显这是不符合开闭原则的,并且如果同样需要增加日志功能的模块不止两个,而是两百个那么这样进行修改的方法必然就是一种时间资源的浪费和代码的重复。因此我们需要使用动态代理。

创建一个动态代理类的构建器(可能不准确,但是可以这么理解)

public class MyInvocationHandler implements InvocationHandler {
    public Object target;   //声明一个target,代表着目标类(需要代理的类,如DoSomeService)

    public MyInvocationHandler(Object target){    //当构造这个动态代理类时,指明目标类
        this.target = target;
    }
    
    //重写invoke()方法,当对象执行方法时就会先执行invoke()方法
    //因此我们在invoke()方法中进行额外功能的增加
    @Override
    public Object invoke(Object proxy, Method method,Object[] args){

        Object result = null;        //用来存储目标类执行后的返回值

        try {

            ServiceTool.doLog();    //额外功能(日志)
            result = method.invoke(target,args);    //目标类方法真正被执行
            //注意这里的invoke()方法不是上方重写的那个invoke()方法

            ServiceTool.doCommit(); //额外功能(提交)

        } catch (Exception e) {
            e.printStackTrace();
        }

        return result;        //返回目标类方法执行的返回值
    }
}

动态代理类的使用方法

public static void main(String[] args){
        //target 代表需要被代理的目标类
        SomeService target = new DoSomeService();
        
        //构建动态代理类
        MyInvocationHandler myInvocationHandler = new MyInvocationHandler(target);

        //获取动态代理对象(这个才是真正能被使用的)
        //需要的三个参数分别是:目标类的类构建器,目标类的实现接口,刚刚构建的动态代理类
        SomeService someService = 
        (SomeService) Proxy.newProxyInstance(target.getClass().getClassLoader(),
                                            target.getClass().getInterfaces(),
                                            myInvocationHandler);
        someService.doThat();
    }

执行结果

 

告别Qt Creator!VSCode + QMake + MinGW:从零搭建高效Qt开发环境 本文详细介绍了如何使用VSCode替代Qt Creator搭建高效的Qt开发环境,涵盖VSCode配置、QMake与MinGW集成、智能提示优化及构建调试技巧。通过实战案例展示如何提升开发效率30%以上,特别适合中大型Qt项目开发。 阅读详情

相关推荐

ANSYS Fluent热边界条件避坑指南:为什么你的自然对流计算结果总出错?

本文深入剖析了在ANSYS Fluent中进行自然对流仿真时,导致计算结果出错或发散的核心原因与解决方案。重点解析了重力项与操作密度设置、Boussinesq与不可压缩理想气体模型的抉择、以及压力离散格式(推荐Body Force Weighted)这三大关键雷区,并结合电子机箱散热等实战案例,提供了一套稳定可靠的仿真设置流程与调试技巧。

weixin_28396629的博客 741

自定义手写JDK动态代理

根据Java Porxy 实现原理实现我们手写的自定义代理类,实现简易的动态代理流程。

代码缔造者的博客 399

fNIRS 公开数据集整理

关注“心仪脑”查看更多脑科学知识的分享。 关键词:数据整理、fNIRS 之前我们向大家推送了 Public Neuroscience Dataset 系列主题的第一期:《EEG公开数据集》,我们同时意识到大家对于神经科学公开数据集的需求。本期是该系列主题的第二期,我们在延续第一期初衷的基础上,整理了功能性近红外光谱(fNIRS)技术的公开数据集。 fNIRS 是一种非侵入性、便携且价格低廉的光学神经成像技术,它具有可观的空间和时间分辨率。因fNIRS技术问世较EEG晚了许多,所以应用此技术开展研究发.

psybrain的博客 4272

JAVA 自定义动态代理实现

在正式介绍自定义动态代理之前,先提出以下几个问题: 1、为什么叫做动态代理,它得动态表现在哪些方面? 2、动态代理得声明,才是我们写代码得地方,实现了 invocationHandler接口的类叫做声明? 3、声明类中的invoke方法到底是谁用的 ? 4、动态代理类$Proxy0还原? 5、JDK内存中的动态代理是没有对被代理类进行任何操作的? 下

肖的专栏 1269

LTspice基础教程-028.Timestep too small

Q: “Timestep too small” error message A: If the LTspice program can’t find a solution for the guessed time step, then the program decreases the time step and tries again. This can’t work forever. If...

gaoyong_wang的博客 2万+

向量数据库安全实战:从Embedding反推到检索越权的全链路防护

随着RAG应用在企业中的普及,向量数据库已成为知识库系统的核心组件。但许多团队对向量数据的安全认知仍停留在传统数据库的账号密码、网络隔离和磁盘加密上。事实上,向量化并非加密,而是一种有损压缩的语义映射,向量本身可以被反推模型还原出原文关键信息,形成高保真的语义泄露通道。同时,相似度检索的模糊匹配特性打破了传统行列权限模型,使得越权检索和成员推断攻击成为新的安全威胁。理解这些原理,有助于企业在数据采集、向量化、索引构建、检索查询等环节构建分层防护体系,包括脱敏、扰动、过滤下推、网关控制等手段。本文从基础概念出

weixin_29323551的博客 259

JDK动态代理简单实现

java中的动态代理简单实现

sora33的博客 980

揭秘Outlook/QQ邮箱伪造:如何利用Unicode编码绕过SPF检测

本文深入剖析了利用Unicode编码进行邮件显示名伪造的攻击手法,揭示了攻击者如何通过插入零宽字符等特殊编码绕过SPF检测,使邮件在Outlook、QQ邮箱等客户端中看似来自可信发件人。文章通过Python代码示例演示了伪造过程,并提供了从用户自查到管理员部署DMARC策略的多层次防御建议。

weixin_29063035的博客 334

jdk实现的动态代理

概念 代理的目标是在不修改现有代码的前提下对方法进行增强,实现在执行方法之前或之后进行某些操作,如日志记录、数据库事务操作等。 静态代理。由我们自己去定义一个代理类,去包含要被代理的类(以下称为目标类),并暴露和目标类一样的方法供外界调用,然后在这个方法里面调用目标类的具体方法,此时就可以在调用目标类的具体方法前后进行其他操作了。 动态代理。由jvm在程序运行期动态去创建代理类,这样就解决了静态代理的致命缺点:当目标类新增了要被代理的方法时需要再次修改代理类的代码。比较知名的动态代理实现主要有jdk与cg

qq_40246487的博客 370

裂缝二维检测:裂缝的长度和宽度检测

这一节,我们需要去整合一下前面的代码,在进行长度和宽度的测量时,需要裂缝的类型、个数、面积的帮助。这一章是本专栏的核心部分。以上代码我均试过,由于本人能力有限,看不懂代码,最终还是没有采用,使用的是最普通检测宽度的方法,即求得骨架总长度后,用总面积求取平均宽度。

m0_62919535的博客 4242

华为OD机试双机位C卷-用户入网定期复评(C/C++/Py/Java/Js/Go)

华为OD机试(机考)双机位C卷 【用户入网定期复评】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【用户入网定期复评】。

qq_45776114的博客 840

JDK动态代理的实现

jdk动态代理小案例代码

xiaobaijun_ge的博客 1501

【Unity 实用工具篇】✨| 受击插件Feel 详细教程,开发游戏时更好的操控 游戏打击感

在一个游戏中,游戏手感对于游戏的整体游玩体验是非常重要的,而游戏手感中有一个很重要的点:打击感 那本篇文章就来讲一下打击感中的受击反馈部分。 在游戏中经常会用到攻击敌人,敌人扣血,执行某些受击功能的执行,尤其是对于有战斗场景的游戏来说,这就是标准的受击反馈。 所以引出本篇文章的主角:受击插件 Feel 的使用,2D和3D游戏都可以使用。

努力前行,总会成为自己心中的那道光 3万+

jdk 动态代理_来爽一下,看完后你也可以实现JDK动态代理

点击上方☝Java编程技术乐园,轻松关注!及时获取有趣有料的技术文章做一个积极的人编码、改bug、提升自己我有一个乐园,面向编程,春暖花开!开头扯两句:第一句:如果看完本篇没有看懂,请先了解相关的知识!如下:十分钟掌握Java高级开发—反射一文搞懂Java中静态代理、动态代理以及CGLIB代理Java内存管理-掌握自定义类加载器的实现(七)第二句:如果看懂了,一定要亲自去写一遍代码,实践...

weixin_39769767的博客 88

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Java基础 代理模式 实现JDK动态代理

本文从0开始实现JDK动态代理功能,代理模式更多扩展,请参考此链接Java基础 代理模式。 JDK动态代理应用 JDK动态代理角色划分 业务逻辑接口类:需要被代理的接口类。 业务逻辑类:具体业务逻辑代码(增删改查)。 代理逻辑接口类:JDK提供的InvocationHandler接口。 代理逻辑类:具体业务逻辑代码(修改目标方法)。 代理生成类:JDK提供的Proxy类。 实体类User publ...

TBryant的博客 263

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

论JDK动态代理的重要性及自定义自己的动态代理

1、JDK的动态代理 动态代理中的几个角色: 1、被代理类 在jdk中被代理类必须实现接口 2、代理类 在jdk中代理类是运行时动态生成的,所以你在工程中看不到代理类 3、通知类也叫advice 在jdk中通知类必须实现invocationHandler接口   在这里我们举个例子帮助理解 比如,张三是一个IT狗,到了适婚年龄但是没有对象,平时工作忙又没有时间找对象,这时候张三...

Jack博客 381

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

手写JDK动态代理

一,JDK动态代理     在纯手写动态代理前,首先分析一套标准JDK动态代理的执行流程。 1,目标类顶层接口 public interface ProxyInterface { public void targetMethod(); } 2,目标类 public class JDKProxyTarget implements ProxyInterface{ @O...

zp_zhang的博客 2367

【手写系列】纯手写实现JDK动态代理

前言 在Java领域,动态代理应用非常广泛,特别是流行的Spring/MyBatis等框架。JDK本身是有实现动态代理技术的,不过要求被代理的类必须实现接口,不过cglib对这一不足进行了有效补充。本篇博客将涉及2个话题:第一,JDK动态代理的实现原理,带你探索动态代理的实质面目;第二,自己动手写代码去实现JDK动态代理,去创造世界!   JDK动态代理 先写一个例子,感性认识下动态代理...

勇往直前的专栏 917

动态代理——JDK动态代理原理&示例解析(图文并茂)

觉得可以的话点个关注,转个发,加个收藏呗,陆续奉上干货~~~~ 开始~~ 动态代理在Java中有JDK动态代理和CGLIB动态代理,也就是在运行中动态生成字节码并加载到虚拟机中供我们后续使用。下面我们先看下这两种方式的区别。 两者区别: JDK动态代理:需要被代理对象的类实现了某些接口,生成的代理类也会实现相应的接口 CGLIB动态代理:不需要被代理对象的类实现了某些接口,生成的代理类为目标对象的类的子类 下面我们对JDK动态代理进行解析:(源码见下方) 1、java.lang.refle

qq_22772259的博客 9589

jdk动态代理,统计某个方法的执行时间

1、需求统计某个方法的执行时间,写个demo模拟三层结构,dao层,service层,action层,比如要统计UserServiceImpl里面的getUser方法执行了多长时间,代码可能会写成这样: public void testTime(){ long startTime = System.currentTimeMillis(); UserSer

xiejunjie1的专栏 3029

JDK动态代理

本文主要讲解的是JDK动态代理的使用方法 JDK动态代理只能代理接口。 java.lang.reflect.Proxy为JDK的代理类,它为创建动态代理类和实例提供了一些静态方法, 并且它是所有用这些方法创建出来的动态代理类的父类。 以下是Proxy类源码注释中提供的创建动态代理类的两种方法: <p>To create a proxy for some interf...

weixin_30458043的博客 108

jdk动态代理源码分析之自定义实现

疑问 在jdk动态代理中,还是以买房子举例:张三需要买房子,然后房产中介帮助张三找好的房源,但是实际上真正搜索到房源的是电脑,然后电脑返回一系列房源信息。我们可以这么去理解,电脑是我们新生成的代理类,那么它到底是如何一步一步演变而来的呢? 我们要怎么查看动态代理类? try {//直接用流从jvm内存中写出来 byte[] bytes=ProxyGenera...

长风破浪会有33的博客 268

Java反射简介、JDK动态代理实现、注解简介

1. Java反射机制1.1 含义1.2 实现成员2. Class类2.1 实现2.1.1 对象名实现2.1.2 类名实现2.1.3 全限定名实现 1. Java反射机制 1.1 含义 通过Java反射机制,可以动态的访问、操作一个类的信息 1.2 实现成员 Java反射机制通过创建四种对象来实现 Class类 —> 字节码对象类,其实例为某个类的字节码 Field类—>属性类,其...

赵大土的博客 386

jdk动态代理清楚简单解析

总体来说为什么jdk只能代理接口是因为,jdk代理最终会在jdk那边动态生成字节码,会继承Proxy类,java是不能多继承的。首先想要自定义jdk代理,你需要准备,一个接口,一个接口类,一个实现。jdk动态代理是如何进行代理的,为什么只能代理接口类呢?InvocationHandler类;调用方法前: saveUser。调用方法后: saveUser。

m0_73037076的博客 179

jdk 动态代理的原理

一、代理设计模式 代理设计模式是Java常用的设计模式之一。 特点: 01.委托类和代理类有共同的接口或者父类; 02.代理类负责为委托类处理消息,并将消息转发给委托类; 03.委托类和代理类对象通常存在关联关系,一个代理类对象与一个委托类对象关联; 04.代理类本身不是真正的实现者,而是通过调用委托类方法来实现代理功能; 二、静态代理与动态代理 按照代理类创建的时机,代理类分为两...

weixin_34402408的博客 184

手写实现JDK动态代理

前言 在Java领域,动态代理应用非常广泛,特别是流行的Spring/MyBatis等框架。JDK本身是有实现动态代理技术的,不过要求被代理的类必须实现接口,不过cglib对这一不足进行了有效补充。本篇博客将涉及2个话题:第一,JDK动态代理的实现原理,带你探索动态代理的实质面目;第二,自己动手写代码去实现JDK动态代理,去创造世界! JDK动态代理 先写一个例子,感性认识下动态代理~ 业务接口: interface 业务实现类: interface impl 业务处理类:.

YvesHe的专栏 554
上一篇: MyBatis框架_学习笔记
下一篇: Spring 集成 MyBatis
The_RedMaple
博客等级 码龄7年 375粉丝 113原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值