Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >​2.3.2 JDK动态代理 -《SSM深入解析与项目实战》

​2.3.2 JDK动态代理 -《SSM深入解析与项目实战》

原创
作者头像
谙忆
修改于 2020-08-17 02:00:42
修改于 2020-08-17 02:00:42
2340
举报
文章被收录于专栏:程序编程之旅程序编程之旅

2.3.2  JDK动态代理

JDK动态代理是由Java内部使用反射机制来实现的。使用JDK动态代理必须是委托类实现统一的接口,否则JDK动态代理不能应用。虽然有一定的局限性,但是影响不大。java.lang.reflect包中的Proxy类和InvocationHandler 接口提供了生成动态代理类的能力。所以如果需要代理,我们代理类必须InvocationHandler 接口或者继承Proxy类。建议使用InvocationHandler 接口来进行实现代理类。

继续前面的支付场景,我们用JDK动态代理来实现。

首先定义一个支付接口和两个实现类,也就是我们的目标类。

实现类和接口

代码清单2-16:实现类和接口

代码语言:txt
AI代码解释
复制
/**
 * 接口  支付的通用接口方法 
 */
public interface Pay {
    void pay(String operation);
}

/**
 * 委托类  - 一种支付方式 
 */
public class AliPay implements Pay {
    @Override
    public void pay(String operation) {
        System.out.println("进行AliPay支付,操作:" + operation);
    }
}

/**
 * 委托类 - 另一种支付方式 
 */
public class WxPay implements Pay {
    @Override
    public void pay(String operation) {
        System.out.println("进行WxPay支付,操作:" + operation);
    }
}

接下来是重点,也就是我们的代理类。

代码清单2-17:代理类PayProxy

/**
 * JDK动态代理类 
 */
public class PayProxy implements InvocationHandler {
    private Object target;
    /**
     * 构造方法,需要实现代理的真实对象 
     * @param target
     */
    public PayProxy(Object target) {
        this.target = target;
    }

    /**
     * 负责处理动态代理类上的方法调用
     * 根据三个参数进行预处理或者分派到不同的委托类实例上使用反射进行执行
     *
     * @param proxy  被代理的对象
     * @param method 要调用的方法
     * @param args   方法调用时所需要的参数
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //在进行执行目标方法前可以进行操作
        System.out.println("调用之前...");
        System.out.println("Method:" + method);
        //调用真实对象的方法,会跳转到代理对象关联的handler对象的invoke方法来进行调用,内部通过类反射实现
        Object result = method.invoke(target, args);
        //在进行执行目标方法后可以进行操作
        System.out.println("调用之后...");
        return result;
    }
}

更多内容请阅读原文:

https://chenhx.blog.csdn.net/article/details/108011513

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【Java入门提高篇】Day11 Java代理——JDK动态代理
弗兰克的猫
2018/01/09
5150
太好了!总算有人把动态代理、CGlib、AOP都说清楚了!
静态代理是代理类在编译期间就创建好了,不是编译器生成的代理类,而是手动创建的类。在编译时就已经将接口,被代理类,代理类等确定下来。,软件设计中所指的代理一般是指静态代理,也就是在代码中显式指定的代理。
Bug开发工程师
2019/07/12
45.2K3
JDK动态代理
这里是最简单的Java接口和实现类的关系,此时可以开始动态代理了,一般会分为两个步骤:第一是建立代理对象和真实服务对象的代理和被代理关系,第二步是实现代理对象具体方法的逻辑。
itlemon
2020/04/03
5280
Spring框架(七)Java JDK 动态代理(AOP)使用及实现原理分析
Java反射中有Method类 Method类,表示方法类中的方法,通过Method可以执行某个类中的某个方法
一写代码就开心
2021/07/08
4500
JDK动态代理深入探究
在上一篇文章设计模式之代理模式里,我们说了JDK动态代理类,不过我相信好多人都有疑惑,包括我,刚开始学的时候都是一脸懵逼,那么到底疑惑在哪里呢?
秃头哥编程
2019/06/17
3540
Java-JDK动态代理(AOP)
使用JDK的反射机制,创建对象的能力,创建的时代理类的对象.而不用我们创建类的文件.
Java架构师必看
2021/05/14
2810
Java-JDK动态代理(AOP)
深入解析:Cglib与JDK动态代理的实现原理、区别及性能对比
在Java开发中,动态代理是一种强大的技术,它允许在运行时创建代理对象以添加行为,而无需修改原始类的代码。JDK动态代理和Cglib是两种主要的动态代理实现方式。本文将深入探讨它们的实现原理、区别、劣势以及性能对比。
AI码师
2024/05/29
3.1K0
深入解析:Cglib与JDK动态代理的实现原理、区别及性能对比
Java动态代理原理及解析
代理:设计模式 代理模式是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个真实对象的访问。代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理。 通过
Spark学习技巧
2018/04/17
1.2K1
Java动态代理原理及解析
AOP中的JDK动态代理与CGLIB动态代理:深度解析与实战
这里推荐一篇实用的文章:《Java 读取寄存器数据的实现与应用》,作者:【喵手】。
小马哥学JAVA
2024/11/21
2210
从根上理解Cglib与JDK动态代理
最近在阅读到了Spring源码对于两种动态代理使用在不同场景下的使用,两种方式各有利弊写一篇文加深自己的认识。文中对于源码的涉及较少,更多的是作者自己的理解和举例,然后通过部分源码验证。
科技新语
2023/03/07
4380
JDK动态代理详解
JDK动态代理是代理模式的一种,且只能代理接口。spring也有动态代理,成为CGLib,现在主要来看一下JDK动态代理是如何实现的?
Liusy
2020/09/01
1.1K0
JDK动态代理详解
深入Proxy底层源码——实现自己的JDK动态代理
2.使用jdk动态代理获取代理类对象(JDK自动生成代理类) $Proxy0.class,使用反编译工具
须臾之余
2019/07/05
8990
深入Proxy底层源码——实现自己的JDK动态代理
java学习笔记(中级篇)—JDK动态代理
相信大家都知道代理商这个概念,在商业中,代理商无处不在。假设你要去买东西,你不可能去找真正的厂家去买,也不可能直接跟厂家提出需求,代理商就是这中间的一桥梁,连接买家和厂商。你要买或者定制什么产品,需要什么规格样式和价格的直接跟代理商沟通就好了,由代理商与真实的厂商沟通,这样买家有什么问题都可以咨询代理商,真实厂商也就可以专心做产品,不需要管其他事务了,买家也插手不了厂商的事。
chlinlearn
2019/08/15
3480
java学习笔记(中级篇)—JDK动态代理
由反射引出的Java动态代理与静态代理
在《深入剖析Java中的反射,由浅入深,层层剥离!》这篇文章中我们讲反射时,曾提到过Java的动态代理中使用了反射技术,那么好,今天我们要就着反射的索引,来学习一下Java中的代理!
JavaBuild
2024/05/27
950
由反射引出的Java动态代理与静态代理
JDK之动态代理(JDK与CGLIB)与静态代理
代理类在程序运行时创建的代理方式被称为动态代理 静态代理中,代理类是自己定义好的,在程序运行之前就已经编译完成。然而动态代理,代理类并不是在Java代码中定义的,而是运行时根据我们在Java代码中的指示动态生成的。相比较静态代理,动态代理的优势在于可以很方便的对代理类的函数进行统一的处理,而不用修改每个代理类中的方法,比如想要在每个代理方法前都加上一个处理方法,静态代理就需要在每个类内部加上这个方法
才疏学浅的木子
2022/11/28
2220
JDK之动态代理(JDK与CGLIB)与静态代理
017 Java中的静态代理、JDK动态代理、cglib动态代理
一、静态代理 代理模式是常用设计模式的一种,我们在软件设计时常用的代理一般是指静态代理,也就是在代码中显式指定的代理。 静态代理由业务实现类、业务代理类两部分组成。业务实现类负责实现主要的业务方法,业务代理类负责对调用的业务方法作拦截、过滤、预处理。在需要调用业务时,不是直接通过业务实现类来调用的,而是通过业务代理类的同名方法来调用被处理过的业务方法。 静态代理的实现: 1、首先定义一个接口,说明业务逻辑。 package com.nnngu.dao; /** * 定义一个账
nnngu
2018/03/15
6830
JDK动态代理的底层实现原理
JDK动态代理的底层实现原理      动态代理是许多框架底层实现的基础,比如Spirng的AOP等,其实弄清楚了动态代理的实现原理,它就没那么神奇了,下面就来通过案例和分析JDK底层源码来揭秘她的神秘面纱,让她一丝不挂地呈现在我们面前,邪恶了。。。 代理模式定义 存在一个代理对象,并且这个代理对象持有真实对象的引用,以实现对真实对象的访问控制。 举个例子,现在公司一般都有VPN,使我们在家也能访问到公司的内网(比如连接公司的数据库等),实现居家办公。这里VPN相当于一个代理,而公司内网相当于被代理对象,也
汤高
2018/03/28
2.2K0
JDK动态代理的底层实现原理
代理模式之jdk动态代理
有一个方法是invoke (object proxy , Method method object [ ] args );
用户2141593
2019/02/20
4280
浅谈CGLIB动态代理和JDK动态代理 学习笔记
前言 前几天,写一个case,做单元的测试。抛出了依赖注入失败的异常,然后发现是没有配置CGLIB动态代理的原因,默认的JDK动态代理只能基于接口去代理,被代理的类必须要实现一个接口。而CGLIB动态代理可以基于类。 JDK动态代理实现AOP 定义统一的接口类IUserService。 public interface IUserService { void login(); } 定义UserService去实现这个接口,加入自己的逻辑。 public class UserService i
用户2032165
2018/06/05
9640
Java两种动态代理JDK动态代理和CGLIB动态代理[通俗易懂]
代理模式是23种设计模式的一种,他是指一个对象A通过持有另一个对象B,可以具有B同样的行为的模式。为了对外开放协议,B往往实现了一个接口,A也会去实现接口。但是B是“真正”实现类,A则比较“虚”,他借用了B的方法去实现接口的方法。A虽然是“伪军”,但它可以增强B,在调用B的方法前后都做些其他的事情。Spring AOP就是使用了动态代理完成了代码的动态“织入”。
全栈程序员站长
2022/07/02
3640
Java两种动态代理JDK动态代理和CGLIB动态代理[通俗易懂]
推荐阅读
相关推荐
【Java入门提高篇】Day11 Java代理——JDK动态代理
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档