我试图了解代理和动态代理模式之间的区别。 从我到目前为止所读到的,我发现的唯一事情是代理类字节代码是在编译期间创建的,而动态代理是在运行时创建的。 我还缺少另一个差异吗?如果不是那么更喜欢代理而不是动态代理的原因是什么(性能问题除外)
答案 0 :(得分:9)
动态代理本质上是代理设计模式,其中代理对象是在运行时动态创建的。
代理设计模式使用代理,它充当客户端和底层真实对象之间的中介。在将请求委托给真实对象之前,程序员可以在代理中执行访问控制,验证和附加操作。
现在假设您要执行一些通用操作beform调用任何类的任何方法,例如,您希望保留客户端进行的所有方法调用的日志。 在这种情况下,如果要实现代理设计模式,步骤如下:
上述技术的问题在于,假设您有1000个类,您需要为每个类编写1000个代理类,并在所有类中实现基本上做同样事情的所有方法(执行日志记录操作)在我们的例子中),这是一个非常乏味的过程和浪费的记忆。
不管怎样更好,如果在运行时以某种方式,我们能够在委托调用之前基于客户端的调用创建代理对象,然后执行通用操作(在我们的案例中记录操作)对于真实的对象,以及动态代理的作用。
动态代理的过程如下:
所以简而言之,如果你要执行一些通用操作,请使用动态代理,但是如果你希望每个类都被区别对待(在某些类中执行日志记录,在某些类中,在某些访问控制中)等)使用简单的代理。 希望我帮忙。如果您需要代码示例,请告诉我。
答案 1 :(得分:1)
我将尝试提供有关Java的动态代理和经典代理模式的信息。实际上,Java的动态代理也是代理模式的一个例子。
在动态代理案例中,代理类是在运行时创建的,您可以使用InvocationHandler来定义其行为。这意味着动态代理类使用InvocationHandler作为其策略,并将调用委托给其InvocationHandler。
在经典代理模式中,您可以显式创建代理类并在此处实现逻辑。 您可以查看here样本代码。