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

简介: 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

目录
相关文章
|
安全 Oracle Java
JAVA高级开发必备·卓伊凡详细JDK、JRE、JVM与Java生态深度解析-形象比喻系统理解-优雅草卓伊凡
JAVA高级开发必备·卓伊凡详细JDK、JRE、JVM与Java生态深度解析-形象比喻系统理解-优雅草卓伊凡
812 0
JAVA高级开发必备·卓伊凡详细JDK、JRE、JVM与Java生态深度解析-形象比喻系统理解-优雅草卓伊凡
|
设计模式 Java 关系型数据库
【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。
1238 38
|
缓存 Java 索引
查看并解析当前jdk的垃圾收集器
本文介绍了如何查看和解析当前JDK使用的垃圾收集器,通过在IDEA中配置JVM选项并运行示例代码来展示G1垃圾回收器的详细信息和命令行标志。
399 1
查看并解析当前jdk的垃圾收集器
|
数据采集
动态代理与静态代理在爬虫解析的优缺点
随着科技和互联网的发展,越来越多企业需要使用代理进行数据抓取。本文介绍了HTTP动态代理与静态代理的区别,帮助您根据具体需求选择最佳方案。动态代理适合大规模、高效率的爬取任务,但稳定性较差;静态代理则适用于小规模、高稳定性和速度要求的场景。选择时需考虑目标、数据量及网站策略。
397 4
|
Java 开发者 Spring
Spring AOP深度解析:探秘动态代理与增强逻辑
Spring框架中的AOP(Aspect-Oriented Programming,面向切面编程)功能为开发者提供了一种强大的工具,用以将横切关注点(如日志、事务管理等)与业务逻辑分离。本文将深入探讨Spring AOP的底层原理,包括动态代理机制和增强逻辑的实现。
472 4
|
安全 Java 开发者
AOP中的JDK动态代理与CGLIB动态代理:深度解析与实战模拟
【11月更文挑战第21天】面向切面编程(AOP,Aspect-Oriented Programming)是一种编程范式,它通过将横切关注点(cross-cutting concerns)与业务逻辑分离,以提高代码的可维护性和可重用性。在Java开发中,AOP的实现离不开动态代理技术,其中JDK动态代理和CGLIB动态代理是两种常用的方式。本文将从背景、历史、功能点、业务场景、底层逻辑等多个维度,深度解析这两种代理方式的区别,并通过Java示例进行模拟和比较。
1184 5
|
Java 编译器 API
深入解析:JDK与JVM的区别及联系
在Java开发和运行环境中,JDK(Java Development Kit)和JVM(Java Virtual Machine)是两个核心概念,它们在Java程序的开发、编译和运行过程中扮演着不同的角色。本文将深入解析JDK与JVM的区别及其内在联系,为Java开发者提供清晰的技术干货。
541 1
|
Java 关系型数据库 MySQL
【编程基础知识】Eclipse连接MySQL 8.0时的JDK版本和驱动问题全解析
本文详细解析了在使用Eclipse连接MySQL 8.0时常见的JDK版本不兼容、驱动类错误和时区设置问题,并提供了清晰的解决方案。通过正确配置JDK版本、选择合适的驱动类和设置时区,确保Java应用能够顺利连接MySQL 8.0。
1344 1
|
JavaScript 前端开发 索引
Vue3 + Vite项目实战:常见问题与解决方案全解析
Vue3 + Vite项目实战:常见问题与解决方案全解析
1825 0
|
Java 数据库连接 Maven
手把手教你如何搭建SSM框架、图书商城系统案例
这篇文章是关于如何搭建SSM框架以及实现一个图书商城系统的详细教程,包括了项目的配置文件整合、依赖管理、项目结构和运行效果展示,并提供了GitHub源码链接。
手把手教你如何搭建SSM框架、图书商城系统案例

推荐镜像

更多
  • DNS