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

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 2.3.2 JDK动态代理 -《SSM深入解析与项目实战》

2.3.2  JDK动态代理

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

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

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

实现类和接口

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

/**
 * 接口  支付的通用接口方法 
 */
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

目录
相关文章
|
2月前
|
Java
Spring5入门到实战------9、AOP基本概念、底层原理、JDK动态代理实现
这篇文章是Spring5框架的实战教程,深入讲解了AOP的基本概念、如何利用动态代理实现AOP,特别是通过JDK动态代理机制在不修改源代码的情况下为业务逻辑添加新功能,降低代码耦合度,并通过具体代码示例演示了JDK动态代理的实现过程。
Spring5入门到实战------9、AOP基本概念、底层原理、JDK动态代理实现
|
20天前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。
174 37
|
2月前
|
Java API 开发者
Jdk动态代理为啥不能代理Class?
该文章主要介绍了JDK动态代理的原理以及为何JDK动态代理不能代理Class。
Jdk动态代理为啥不能代理Class?
|
2月前
|
存储 数据采集 数据可视化
深入解析GPS接收机的位置数据文件:项目实战从数据解析到可视化
全球定位系统(GPS)是现代技术的支柱之一,广泛应用于交通导航、科学研究、智能设备等领域。GPS接收机通过接收来自卫星的信号,确定设备的地理位置,并将这些位置信息记录在数据文件中。 这些数据文件通常包含大量的信息,如时间、位置、海拔高度、卫星状态等。本篇文章将通过解析这些数据文件,展示如何利用Python和Folium库实现数据的读取、处理和可视化,帮助读者深入理解GPS数据的处理过程。
|
2月前
|
开发者 C# 容器
【独家揭秘】当WPF邂逅DirectX:看这两个技术如何联手打造令人惊艳的高性能图形渲染体验,从环境搭建到代码实践,一步步教你成为图形编程高手
【8月更文挑战第31天】本文通过代码示例详细介绍了如何在WPF应用中集成DirectX以实现高性能图形渲染。首先创建WPF项目并使用SharpDX作为桥梁,然后在XAML中定义承载DirectX内容的容器。接着,通过C#代码初始化DirectX环境,设置渲染逻辑,并在WPF窗口中绘制图形。此方法适用于从简单2D到复杂3D场景的各种图形处理需求,为WPF开发者提供了高性能图形渲染的技术支持和实践指导。
81 0
|
2月前
|
设计模式 Java C++
揭秘!JDK动态代理VS CGLIB:一场关于Java代理界的‘宫心计’,你站哪队?
【8月更文挑战第24天】Java 动态代理是一种设计模式,允许在不改动原类的基础上通过代理类扩展功能。主要实现方式包括 JDK 动态代理和 CGLIB。前者基于接口,利用反射机制在运行时创建代理类;后者采用继承方式并通过字节码技术生成子类实现类的代理。两者在实现机制、性能及适用场景上有明显差异。JDK 动态代理适用于有接口的场景,而 CGLIB 更适合代理未实现接口的类,尽管性能更优但存在一些限制。开发者可根据需求选择合适的代理方式。
85 0
|
3月前
|
数据采集 机器学习/深度学习 数据可视化
完整的Python数据分析流程案例解析-数据科学项目实战
【7月更文挑战第5天】这是一个Python数据分析项目的概览,涵盖了从CSV数据加载到模型评估的步骤:获取数据、预处理(处理缺失值和异常值、转换数据)、数据探索(可视化和统计分析)、模型选择(线性回归)、训练与评估、优化,以及结果的可视化和解释。此流程展示了理论与实践的结合在解决实际问题中的应用。
96 1
|
4月前
|
设计模式 Java 程序员
java动态代理(JDK和cglib)
java动态代理(JDK和cglib)
24 0
|
4月前
|
设计模式 Java 程序员
java动态代理(JDK和cglib)
java动态代理(JDK和cglib)
35 0
|
4月前
|
缓存 Java Maven
JDK 动态代理
JDK 动态代理
22 0

推荐镜像

更多
下一篇
无影云桌面