• 动态代理:一种灵活的设计模式


    动态代理是一种在运行时创建和使用代理对象的设计模式,它可以在不修改原始类和接口的情况下,对原始对象进行额外的操作或增强。动态代理广泛应用于各种编程场景,如前后端处理、数据访问、业务逻辑优化等。本文将介绍动态代理的概念、分类、实现、优化和应用。

    一、动态代理的概念

    动态代理是一种以动态方式创建代理对象的设计模式,它可以在运行时根据需要实现代理对象的创建、调用和销毁。动态代理的主要目的是在不修改原始类和接口的情况下,对原始对象进行额外的操作或增强。它可以帮助开发人员在不修改原有代码的情况下,实现扩展、修改、监控等功能,提高代码的可维护性和可重用性。

    二、动态代理的分类

    根据实现方式的不同,动态代理可以分为以下几类:

    1. 基于接口的动态代理:通过实现Java的InvocationHandler接口来创建动态代理对象。
    2. 基于契约的动态代理:通过定义一个特定的契约或模板方法,来实现动态代理对象的创建和使用。
    3. 基于反射的动态代理:通过Java的反射机制来创建动态代理对象,可以实现对任意对象的代理。
    4. 基于字节码的动态代理:通过修改字节码来实现动态代理对象,如ASM、CGLIB等库的使用。

    三、动态代理的实现

    下面以基于接口的动态代理为例,介绍动态代理的实现过程:

    1. 定义一个InvocationHandler接口,实现invoke()方法。
    public interface InvocationHandler {
        Object invoke(Object proxy, Method method, Object[] args) throws Throwable;
    }
    
    • 1
    • 2
    • 3
    1. 创建一个实现InvocationHandler接口的类,实现invoke()方法。在该方法中,可以实现对原始对象的方法调用和处理。
    public class MyInvocationHandler implements InvocationHandler {
        private Object target;
        public MyInvocationHandler(Object target) {
            this.target = target;
        }
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            // 在调用原始方法前,可以进行额外的操作或增强
            System.out.println("Before calling method " + method.getName());
            Object result = method.invoke(target, args);
            System.out.println("After calling method " + method.getName());
            // 在调用原始方法后,可以进行额外的操作或增强
            return result;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    1. 创建一个实现被代理接口的类,并将其作为参数传递给Proxy.newProxyInstance()方法。同时,将InvocationHandler对象作为参数传递给该方法。该方法将返回一个代理对象。
    public interface MyInterface {
        void doSomething();
    }
    public class MyClass implements MyInterface {
        public void doSomething() {
            System.out.println("Doing something...");
        }
    }
    public class Main {
        public static void main(String[] args) {
            MyInterface myObj = new MyClass();
            InvocationHandler handler = new MyInvocationHandler(myObj);
            MyInterface proxyObj = (MyInterface) Proxy.newProxyInstance(MyInterface.class.getClassLoader(), new Class[]{MyInterface.class}, handler);
            proxyObj.doSomething(); // 调用代理对象的方法,将触发InvocationHandler中的invoke()方法,实现对原始对象的额外操作或增强。输出:Before calling method doSomething() Doing something... After calling method doSomething()。
            }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
  • 相关阅读:
    java计算机毕业设计信用卡逾期数据处理分析系统源程序+mysql+系统+lw文档+远程调试
    天命数(c++基础)
    react-router-dom V5版本 路由搭建
    Mpeg-NTA((Nitrilotriacetic acid)) 次氮基三乙酸
    FullGC频繁,线程数持续增长排查
    一文带你认知定时消息发布RocketMQ
    【Leetcode】120.三角形最小路径和
    idea集成本地tomcat
    树莓派系统安装,使用SSD/U盘启动centos
    VSCode上手指南
  • 原文地址:https://blog.csdn.net/Coder_Qiang/article/details/134077967