静态代理和动态代理的区别是什么?

原创
ithorizon 8个月前 (09-01) 阅读数 83 #Java

静态代理和动态代理的区别是什么?

在软件开发中,代理模式是一种设计模式,用于为其他对象提供一种代理以控制对这个对象的访问。代理可以分为静态代理和动态代理,它们在Java语言中尤其常见。接下来,我们将探讨这两种代理的区别。

静态代理

静态代理在编译时就已经确定代理类和原始类的关系。代理类通常是由程序员手动编写的,要为每个要代理的类都创建一个代理类。

// 原始接口

public interface Service {

void execute();

}

// 原始类

public class RealService implements Service {

public void execute() {

System.out.println("执行任务");

}

}

// 静态代理类

public class StaticProxy implements Service {

private Service service;

public StaticProxy(Service service) {

this.service = service;

}

public void execute() {

// 代理逻辑,可以在调用真实对象的方法前后添加自己的逻辑

System.out.println("预处理");

service.execute();

System.out.println("后处理");

}

}

动态代理

动态代理则是在程序运行时,利用反射机制动态创建的代理做法,不需要手动编写代理类。在Java中,可以通过java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口来创建一个代理实例。

import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Proxy;

// 动态代理实现

public class DynamicProxy implements InvocationHandler {

private Object target; // 目标对象

public DynamicProxy(Object target) {

this.target = target;

}

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

// 代理逻辑

System.out.println("预处理");

Object result = method.invoke(target, args); // 调用目标对象的方法

System.out.println("后处理");

return result;

}

// 创建代理对象的方法

public Object getProxy() {

return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);

}

}

区别

1. 编写做法:静态代理需要在编译期就定义好代理类,而动态代理不需要手动编写代理类,它是在运行时动态生成的。

2.类的个数:静态代理会产生多个代理类,每个代理类对应一个目标类;动态代理通过 InvocationHandler 和 Proxy 类可以在运行时动态生成代理实例,不需要手动编写多个代理类,从而减少了类的数量。

3.扩展性:动态代理具有更好的扩展性,归因于代理类的创建和代理逻辑的编写都是动态的,可以通用于任何符合代理条件的对象;而静态代理的扩展性较差,一旦接口增长方法,代理类和目标对象都需要进行修改。

4.性能:静态代理在运行时性能略优于动态代理,归因于动态代理的反射机制会引入额外的性能开销。

综上所述,静态代理和动态代理各有优缺点,选择哪种做法取决于实际场景的需求。


本文由IT视界版权所有,禁止未经同意的情况下转发

文章标签: Java


热门