当前位置: 首页 > article >正文

Java之动态代理

一,动态代理简介

Java动态代理是一种在运行时创建接口实现类的技术,可以用来在不修改原业务逻辑的情况下,增加额外的功能,如事务管理、日志记录等。Java 动态代理主要依赖于 java.lang.reflect包下的Proxy类和InvocationHandler接口

二, 动态代理适用场景

1.AOP(面向切面编程):在不修改原有业务逻辑的基础上,添加横切关注点,如日志记录、性能监控、权限检查等。
2.事务管理:在方法调用前后自动开启和提交事务。
3.缓存:在访问数据库之前先检查缓存,如果存在则直接返回缓存数据。
4.安全控制:在方法调用前检查用户是否有权限执行该操作。

三,动态代理的核心组件

组件功能
接口(Interface)定义了目标对象需要实现的方法
目标对象(Target Object)实现了接口的具体业务逻辑的对象
代理对象(Proxy Object)由 Proxy 类创建,实现了与目标对象相同的接口
调用处理器(InvocationHandler)处理代理对象上的方法调用,通常会调用目标对象的方法,并在此过程中添加额外的功能

四,InvocationHandler接口

定义了一个 invoke 方法,每当通过代理对象调用一个方法时,都会转而调用此方法。invoke 方法有三个参数:

参数含义
Object proxy代理对象本身
Method method被调用的方法对象
Object[] args传给被调用方法的参数数组

五,创建动态代理的基本步骤

1.定义接口

public interface Star {
    String sing(String songName);
    String dance(String danceName);
}

2.定义目标对象并实现接口

public class Singer implements Star{
    private String name;

    public Singer(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String sing(String songName) {
        return name + "演唱歌曲《" + songName + "》";
    }

    @Override
    public String dance(String danceName) {
        return name + "表演舞蹈《" + danceName + "》";
    }
}

3.实现调用处理器类

public class StarInvocationHandler implements InvocationHandler {
    private Star star;

    public StarInvocationHandler(Star star) {
        this.star = star;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("表演前的准备工作");
        Object result = method.invoke(star, args);
        System.out.println("表演后的收尾工作");
        return result;
    }
}

4.创建并使用代理对象

public class DynamicProxyDemo {
    public static void main(String[] args) {
        Singer singer = new Singer("薛之谦");
        StarInvocationHandler invocationHandler = new StarInvocationHandler(singer);
        Star starProxy = (Star) Proxy.newProxyInstance(
                Singer.class.getClassLoader() // 指定代理对象使用的类加载器
                , new Class[]{Star.class} // 指定代理对象需要实现的接口列表
                , invocationHandler // 指定调用处理器,即当通过代理对象调用方法时,实际调用的是这个处理器的 invoke 方法
        );
        starProxy.sing("演员");
        starProxy.dance("街舞");
    }
}

http://www.kler.cn/news/363378.html

相关文章:

  • 管理类联考 信息整理和经验分享
  • 程序员:代码世界的探险家与日常“救火队员”
  • three.js 灯光
  • 音质最好的麦克风有哪些?领夹麦克风哪个品牌好?麦克风十大品牌
  • linux网络编程4——WebSocket协议及服务器的简易实现
  • 在 VS Code 中轻松绘图:Draw.io Integration 插件详解
  • MoeCTF 2024 ---Misc方向WP
  • 【WPF】中Dispatcher的DispatcherPriority参数使用
  • 滚雪球学Redis[8.2讲]:Redis的未来发展趋势:从云服务到AI与物联网的前沿探索
  • javaWeb项目-ssm+jsp大学生校园兼职系统功能介绍
  • 【网络安全渗透测试零基础入门】之Hydra密码爆破工具使用教程图文教程,超强干货建议收藏!
  • AI大模型应用(3)开源框架Vanna: 利用RAG方法做Text2SQL任务
  • 【表情识别】Python+卷积神经网络算法+人工智能+深度学习+Django网页界面+算法模型+TensorFlow
  • Windows.h 和pcl有冲突
  • 通用序列化和反序列化实现思路
  • 使用注解@ExcelIgnoreUnannotated实现了在导出 Excel 时忽略没有被标注的字段
  • 【已解决】【Hadoop】HDFS操作时:未找到命令的解决办法
  • 无线领夹麦克风哪个牌子好,麦克风品牌排行榜前十名,选购推荐
  • 人工智能:重塑未来生活与工作的科技力量
  • QT 实现随机码验证
  • Spring + WebSocket
  • SparkSQL整合Hive
  • Java集合(2 :List)
  • 【数据库】postgres数据库命令
  • 【树莓派 5B】Python 版本切换
  • C++之《剑指offer》学习记录(6):unordered_set和unordered_map