文章目录

  • 📖Java 动态代理和静态代理的区别
  • 🔖下面是一个结合代码示例
  • 🔖运行上述代码,输出如下
  • 📈总结


📖Java 动态代理和静态代理的区别


java.lang.reflect.Proxyjava.lang.reflect.InvocationHandler

🔖下面是一个结合代码示例

Java 动态代理和静态代理 详解(结合代码实列)

展示了Java中动态代理和静态代理的区别:

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

// 接口定义
interface Subject {
    void doSomething();
}

// 静态代理类
class StaticProxy implements Subject {
    private Subject realSubject;

    public StaticProxy(Subject realSubject) {
        this.realSubject = realSubject;
    }

    public void doSomething() {
        System.out.println("静态代理 - 前置处理");
        realSubject.doSomething();
        System.out.println("静态代理 - 后置处理");
    }
}

// 动态代理处理器
class DynamicProxyHandler implements InvocationHandler {
    private Object realObject;

    public DynamicProxyHandler(Object realObject) {
        this.realObject = realObject;
    }

    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("动态代理 - 前置处理");
        Object result = method.invoke(realObject, args);
        System.out.println("动态代理 - 后置处理");
        return result;
    }
}

public class Main {
    public static void main(String[] args) {
        // 创建被代理对象
        Subject realSubject = new RealSubject();

        // 静态代理示例
        Subject staticProxy = new StaticProxy(realSubject);
        staticProxy.doSomething();

        System.out.println("------------------");

        // 动态代理示例
        Subject dynamicProxy = (Subject) Proxy.newProxyInstance(
                realSubject.getClass().getClassLoader(),
                realSubject.getClass().getInterfaces(),
                new DynamicProxyHandler(realSubject)
        );
        dynamicProxy.doSomething();
    }
}

// 实现类
class RealSubject implements Subject {
    public void doSomething() {
        System.out.println("执行业务操作");
    }
}
SubjectSubjectRealSubjectStaticProxystaticProxydoSomething()DynamicProxyHandlerInvocationHandlerProxy.newProxyInstance()dynamicProxydoSomething()

🔖运行上述代码,输出如下


静态代理 - 前置处理
执行业务操作
静态代理 - 后置处理
------------------
动态代理 - 前置处理
执行业务操作
动态代理 - 后置处理

📈总结


  • 从输出结果可以看出,静态代理和动态代理都在原始对象的方法调用前后添加了额外的处理逻辑。但是,静态代理需要提前手动编写代理类,而动态代理则是在运行时生成代理对象。
  • 静态代理在编写和使用上更为直观,但是当需要代理多个类或接口时,需要为每个类或接口编写特定的代理类,有一定的重复工作。而动态代理可以更加灵活地决定代理哪些类或接口,并且减少了代码的重复性。
  • Java中的动态代理和静态代理都是代理模式的实现方式,适用于不同的场景。
  • 静态代理适合以下场景:
  • 当目标对象(被代理对象)数量有限且确定时,可以通过手动编写代理类来实现静态代理。静态代理在编译时就创建了代理类,因此在运行时性能较好。
  • 静态代理对目标对象进行了封装,在不修改原有代码的情况下增加了额外的功能。这使得静态代理常被用于日志记录、事务管理等横切关注点。
  • 动态代理适合以下场景:
  • 当目标对象数量不确定或者无法提前确定时,动态代理可以更方便地生成代理对象。它在运行时生成代理类和代理对象,避免了手动编写多个代理类的繁琐工作。
  • 动态代理可以灵活地在运行时为目标对象添加、删除或更改代理行为。这使得动态代理常被用于AOP(面向切面编程)、RPC(远程过程调用)等应用场景。
  • 需要注意的是,由于动态代理在运行时通过反射机制创建代理类和代理对象,因此相比静态代理,其性能可能略低。此外,动态代理只能代理实现了接口的目标对象,而静态代理没有这个限制。
  • 总结起来,静态代理适用于目标对象数量有限且确定、需要封装和增加额外功能的场景;而动态代理适用于目标对象数量不确定或无法提前确定、需要灵活添加、删除或更改代理行为的场景。根据具体需求和情况,选择合适的代理方式。


阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。