问答题735/1053静态代理和动态代理的区别

难度:
2021-11-02 创建

参考答案:

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


对比点静态代理动态代理
代理类的生成方式在编译期间生成代理类,代理类是预先写好的。在运行期间动态生成代理类,通常通过反射机制实现。
代码维护性每个被代理类都需要一个对应的代理类,增加了代码冗余。不需要为每个被代理类编写代理类,代理逻辑可复用,维护性更好。
实现方式代理类由开发者手动实现。使用 Java 提供的 Proxy 类(JDK 动态代理)或字节码工具(如 CGLIB)。
灵活性只能为特定接口或类提供代理,灵活性较低。可以为任意接口或类提供代理,灵活性更高。
使用限制代理类的行为是固定的,不支持运行时修改。代理类的行为可在运行时动态定义。
性能性能较高,适合简单场景。性能稍低于静态代理(动态生成代理类的开销),适合复杂场景。
应用场景适合少量、明确的代理需求,如日志、权限校验。适合需要对大量类或接口进行统一代理处理的场景,如 AOP。

静态代理和动态代理的例子

静态代理

手动定义一个代理类,通过代理类调用目标对象的方法。

1// 接口 2public interface Service { 3 void doSomething(); 4} 5 6// 目标类 7public class RealService implements Service { 8 @Override 9 public void doSomething() { 10 System.out.println("RealService: Doing something..."); 11 } 12} 13 14// 代理类 15public class StaticProxy implements Service { 16 private RealService realService; 17 18 public StaticProxy(RealService realService) { 19 this.realService = realService; 20 } 21 22 @Override 23 public void doSomething() { 24 System.out.println("StaticProxy: Before doing something..."); 25 realService.doSomething(); 26 System.out.println("StaticProxy: After doing something..."); 27 } 28} 29 30// 测试 31public class Main { 32 public static void main(String[] args) { 33 RealService realService = new RealService(); 34 Service proxy = new StaticProxy(realService); 35 proxy.doSomething(); 36 } 37}

动态代理

通过 Java 提供的 Proxy 类动态生成代理对象。

1import java.lang.reflect.InvocationHandler; 2import java.lang.reflect.Method; 3import java.lang.reflect.Proxy; 4 5// 接口 6public interface Service { 7 void doSomething(); 8} 9 10// 目标类 11public class RealService implements Service { 12 @Override 13 public void doSomething() { 14 System.out.println("RealService: Doing something..."); 15 } 16} 17 18// 动态代理处理器 19public class DynamicProxyHandler implements InvocationHandler { 20 private Object target; 21 22 public DynamicProxyHandler(Object target) { 23 this.target = target; 24 } 25 26 @Override 27 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 28 System.out.println("DynamicProxy: Before invoking " + method.getName()); 29 Object result = method.invoke(target, args); 30 System.out.println("DynamicProxy: After invoking " + method.getName()); 31 return result; 32 } 33} 34 35// 测试 36public class Main { 37 public static void main(String[] args) { 38 RealService realService = new RealService(); 39 Service proxy = (Service) Proxy.newProxyInstance( 40 realService.getClass().getClassLoader(), 41 realService.getClass().getInterfaces(), 42 new DynamicProxyHandler(realService) 43 ); 44 proxy.doSomething(); 45 } 46}

最近更新时间:2024-12-08