静态代理和动态代理的区别是什么?
原创静态代理和动态代理的区别是什么?
在软件开发中,代理模式是一种设计模式,用于为其他对象提供一种代理以控制对这个对象的访问。代理可以分为静态代理和动态代理,它们在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.性能:静态代理在运行时性能略优于动态代理,归因于动态代理的反射机制会引入额外的性能开销。
综上所述,静态代理和动态代理各有优缺点,选择哪种做法取决于实际场景的需求。