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

JDK实现动态代理介绍+案例

1、基本概念

        JDK 动态代理是 Java 提供的一种在运行时创建代理对象的机制,它允许在不修改目标对象代码的情况下,对目标对象的方法进行增强。这种机制主要基于接口,代理对象会实现与目标对象相同的接口,从而可以在调用目标对象方法前后添加额外的逻辑。

2、代码实现

public class yinyon {
    public static void main(String[] args) {
        InvocationHandler handler = new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("打印方法的参数:"+args[0]);
                if(method.getName().equals("hello")){
                    System.out.println("Hello"+args[0]);
                }
                return null;
            }
        };
        //使用代理方法:
        Hellocontroller Hellocontroller = (Hellocontroller) Proxy.newProxyInstance(Hellocontroller.class.getClassLoader(),new Class[]{Hellocontroller.class},handler);
        Hellocontroller.hello("cai");


    }

}

interface Hellocontroller{
    void hello(String name);
}

关键的类和接口:

3、关键类和接口

  • java.lang.reflect.Proxy:这是 JDK 动态代理的核心类,提供了创建代理对象的静态方法 newProxyInstance。该方法接收三个参数:

    • ClassLoader loader:目标对象的类加载器。
    • Class<?>[] interfaces:目标对象实现的接口数组。
    • InvocationHandler h:调用处理器,用于处理代理对象方法的调用。
  • java.lang.reflect.InvocationHandler:这是一个接口,其中只有一个方法 invoke,用于定义代理对象方法被调用时的具体逻辑。该方法接收三个参数:

    • Object proxy:代理对象本身。
    • Method method:被调用的目标方法。
    • Object[] args:调用目标方法时传递的参数。

4、优缺点分析

优点
  • 解耦性好:代理逻辑与目标对象分离,代理对象和目标对象之间通过接口进行交互,降低了代码的耦合度,便于维护和扩展。
  • 遵循开闭原则:不需要修改目标对象的代码,只需要在调用处理器中添加额外的逻辑,符合开闭原则,即对扩展开放,对修改关闭。
缺点
  • 只能代理接口:JDK 动态代理要求目标对象必须实现接口,对于没有实现接口的类,无法使用 JDK 动态代理。
  • 性能开销:由于使用了反射机制来调用目标对象的方法,反射调用的性能相对较低,尤其是在频繁调用的场景下,会带来一定的性能开销。

http://www.kler.cn/a/537626.html

相关文章:

  • Linux之文件IO前世今生
  • 论文阅读--LlaVA
  • amis组件crud使用踩坑
  • Unity-Mirror网络框架-从入门到精通之Discovery示例
  • 设计模式-策略模式
  • Android修行手册-五种比较图片相似或相同
  • Termux安装ssh实现电脑ssh
  • 详解在Pytest中忽略测试目录的三种方法
  • DeepSeek:从入门到精通(100页PDF)
  • MySQL InnoDB引擎 事务隔离级别
  • 【AIGC】冷启动数据与多阶段训练在 DeepSeek 中的作用
  • 网络编程day2-套接字与TPC服务器与客户端的搭建
  • 什么是java中的线程同步
  • 【Python实战练习】Python类中的方法:形式与作用详解
  • 三次方程的几何新视界:双曲线-抛物线交点法与旋转圆系法
  • 去除 RequestTemplate 对象中的指定请求头
  • 优惠券平台(十二):EasyExcel解析实现用户优惠券分发(2)
  • 未来AI医院蓝图:源码、机器人与数字孪生如何打造智能医疗APP?
  • ArcGIS技术与土地利用分析全流程实践----从数据管理到建模预测
  • AIGC-PPT创作智能体完整指令(DeepSeek,豆包,千问,Kimi,GPT)
  • 基于ssm的药店管理系统
  • 第26场蓝桥入门赛
  • AI绘画社区:解锁艺术共创的无限可能(9/10)
  • OnlyOffice docker 运行(详细)
  • CS架构软件网络安全 csf网络安全框架
  • Thymeleaf在循环时设置递增序号