Java 动态代理的区别
Java 动态代理是一种在运行时创建代理对象的机制,它可以通过反射机制来实现。它的主要作用是在不修改原有代码的情况下,对方法进行增强或拦截。
Java 动态代理有两种方式:基于接口的动态代理和基于类的动态代理。
-
基于接口的动态代理: 基于接口的动态代理是通过实现 JDK 提供的
InvocationHandler接口来实现的。代理类必须实现与目标接口相同的接口,并在InvocationHandler的invoke方法中对目标方法进行增强或拦截。这种方式只能代理接口,不能代理类。 -
基于类的动态代理: 基于类的动态代理是通过继承
java.lang.reflect.Proxy类来实现的。代理类必须继承Proxy类,并在其构造方法中传入一个InvocationHandler对象,该对象负责对目标方法进行增强或拦截。这种方式可以代理接口和类。
区别如下:
- 基于接口的动态代理只能代理接口,而基于类的动态代理可以代理接口和类。
- 基于接口的动态代理需要实现与目标接口相同的接口,而基于类的动态代理需要继承
Proxy类。 - 基于接口的动态代理使用起来更加方便,只需实现一个接口并传入
InvocationHandler对象即可,而基于类的动态代理需要继承Proxy类并重写invoke方法。 - 基于接口的动态代理在生成代理对象时性能较好,而基于类的动态代理在生成代理对象时性能较差。
原文地址: https://www.cveoy.top/t/topic/i9dq 著作权归作者所有。请勿转载和采集!