qidao123.com技术社区-IT企服评测·应用市场

标题: JAVA 静态代理 & 动态代理 [打印本页]

作者: 鼠扑    时间: 2024-11-21 17:40
标题: JAVA 静态代理 & 动态代理
Java中,代理模式是一种常见的设计模式,用于为某对象提供一种代理,以控制对该对象的访问。根据代理类的实现方式,可以分为静态代理和动态代理。以下将分别介绍这两种方式,并进行对比分析。
静态代理

静态代理是指在编译时期就已经确定了代理类的实现。代理类必要实现与目标对象相同的接口,并持有目标对象的引用,通过代理对象调用目标对象的方法。
静态代理的实现步骤

示例代码
  1. // 定义接口
  2. public interface Hello {
  3.     void morning(String name);
  4. }
  5. // 目标类
  6. public class HelloWorld implements Hello {
  7.     @Override
  8.     public void morning(String name) {
  9.         System.out.println("Good morning, " + name);
  10.     }
  11. }
  12. // 代理类
  13. public class HelloProxy implements Hello {
  14.     // 内部维护一个目标代理对象的属性字段
  15.     private Hello target;
  16.     public HelloProxy(Hello target) {
  17.         this.target = target;
  18.     }
  19.     @Override
  20.     public void morning(String name) {
  21.         System.out.println("Before method invoke...");
  22.         target.morning(name); // 调用目标类方法
  23.         System.out.println("After method invoke...");
  24.     }
  25. }
  26. // 测试静态代理
  27. public class Main {
  28.     public static void main(String[] args) {
  29.         Hello target = new HelloWorld();       // 创建目标对象
  30.         Hello proxy = new HelloProxy(target); // 创建代理对象
  31.         proxy.morning("Bob");                 // 调用代理方法
  32.     }
  33. }
复制代码
输出:
  1. Before method invoke...
  2. Good morning, Bob
  3. After method invoke...
复制代码
优点
缺点
动态代理

动态代理是指在运行时动态生成代理类,而不必要提前定义实现类。它的实现重要依赖于Java的java.lang.reflect.Proxy和InvocationHandler。
动态代理的实现步骤

示例代码
  1. import java.lang.reflect.InvocationHandler;
  2. import java.lang.reflect.Method;
  3. import java.lang.reflect.Proxy;
  4. // 定义接口
  5. public interface Hello {
  6.     void morning(String name);
  7. }
  8. // 测试动态代理
  9. public class Main {
  10.     public static void main(String[] args) {
  11.         // 创建InvocationHandler
  12.         InvocationHandler handler = new InvocationHandler() {
  13.             @Override
  14.             public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
  15.                 System.out.println("Before method invoke...");
  16.                 if (method.getName().equals("morning")) {
  17.                     System.out.println("Good morning, " + args[0]);
  18.                 }
  19.                 System.out.println("After method invoke...");
  20.                 return null;
  21.             }
  22.         };
  23.         // 创建动态代理对象
  24.         Hello hello = (Hello) Proxy.newProxyInstance(
  25.             Hello.class.getClassLoader(),     // 类加载器
  26.             new Class[] { Hello.class },      // 需要实现的接口
  27.             handler                           // 方法调用处理器
  28.         );
  29.         // 调用代理方法
  30.         hello.morning("Bob");
  31.     }
  32. }
复制代码
输出
  1. Before method invoke...
  2. Good morning, Bob
  3. After method invoke...
复制代码
动态代理的核心:
动态代理本质上是JVM在运行时生成代理类的字节码,并加载到内存中。
静态代理与动态代理的对比

特点静态代理动态代理代理类实现方式编译时定义代理类运行时动态生成代理类对接口的支持每个接口必要单独实现代理类可通用,只需实现InvocationHandler代码扩展性低,新增接口时需增长代理类高,只需更改代理逻辑即可性能开销无需反射,性能较高依赖反射调用,性能略低应用场景小型项目或接口稳定的场景大型项目、动态扩展功能的场景总结

动态代理的强盛之处在于,它将代理逻辑与详细实现解耦,使得代码更加灵活、可维护,同时提供了更高的复用性。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 qidao123.com技术社区-IT企服评测·应用市场 (https://dis.qidao123.com/) Powered by Discuz! X3.4