返回

Java 三大代理模式:静态代理、动态代理、CGLIB 代理,解惑痛点!

后端

揭秘 Java 代理模式:访问控制、日志记录和缓存利器

什么是 Java 代理模式?

代理模式是一种设计模式,它允许你创建代理类来控制对另一个对象的访问。代理类和原始类实现相同的接口,所以客户端在使用时无需关心具体的实现细节。

静态代理

静态代理是在编译时创建代理类的代理模式。代理类和原始类都实现相同的接口,客户端在使用时通过代理类访问原始类。

动态代理

动态代理是在运行时创建代理类的代理模式。代理类由 Java 虚拟机 (JVM) 动态生成,客户端在使用时通过代理类访问原始类。

CGLIB 代理

CGLIB 代理是一种基于字节码生成技术的动态代理模式。CGLIB 代理类是通过修改原始类的字节码来创建的,因此可以代理任何类,无论是否实现接口。

应用场景

Java 代理模式有广泛的应用场景,包括:

  • 日志记录: 代理类可以记录原始类的调用信息
  • 安全: 代理类可以控制对原始类的访问,防止未经授权的访问
  • 缓存: 代理类可以缓存原始类的方法调用结果,提高性能
  • 分布式系统: 代理类可以代理远程对象,实现分布式系统的通信

优缺点

优点:

  • 提高灵活性
  • 提高安全性
  • 提高性能

缺点:

  • 性能开销
  • 可读性差

代码示例

下面是一个使用动态代理的示例代码:

import java.lang.reflect.Proxy;

public class DynamicProxyExample {

    public static void main(String[] args) {
        // 原始类
        OriginalClass originalClass = new OriginalClass();

        // 代理类
        ProxyClass proxyClass = new ProxyClass(originalClass);

        // 调用代理类的方法
        proxyClass.method();
    }

    private static class OriginalClass {
        public void method() {
            System.out.println("Original class method called");
        }
    }

    private static class ProxyClass implements InvocationHandler {

        private final Object originalObject;

        public ProxyClass(Object originalObject) {
            this.originalObject = originalObject;
        }

        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            System.out.println("Proxy class method called before original method");
            Object result = method.invoke(originalObject, args);
            System.out.println("Proxy class method called after original method");
            return result;
        }
    }
}

常见问题解答

  1. 静态代理和动态代理有什么区别?
    静态代理是在编译时创建代理类的,而动态代理是在运行时创建代理类的。

  2. CGLIB 代理和动态代理有什么区别?
    CGLIB 代理可以代理任何类,无论是否实现接口,而动态代理只能代理实现接口的类。

  3. 代理模式的优点是什么?
    代理模式的优点包括提高灵活性、安全性和性能。

  4. 代理模式的缺点是什么?
    代理模式的缺点包括性能开销和可读性差。

  5. 代理模式有哪些应用场景?
    代理模式的应用场景包括日志记录、安全、缓存和分布式系统通信。