动态代理和静态代理有什么区别?
时间: 2024-01-11 15:05:49 浏览: 211
两种代理模式的区别-反射与代理ppt
动态代理和静态代理的区别在于代理类的生成时机不同。静态代理是在编译期间就已经确定代理类,而动态代理是在运行时动态生成代理类。
动态代理的实现需要借助Java反射机制,可以在运行时动态地创建代理类和代理对象,无需手动编写代理类。相比之下,静态代理需要手动编写代理类,增加了代码量和维护成本。
另外,动态代理可以代理任意一个实现了接口的类,而静态代理只能代理固定的接口或类。因此,动态代理具有更强的灵活性和扩展性。
下面是一个简单的动态代理示例,用于代理一个实现了Calculator接口的类:
```python
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
interface Calculator {
int add(int a, int b);
}
class CalculatorImpl implements Calculator {
public int add(int a, int b) {
return a + b;
}
}
class CalculatorProxy implements InvocationHandler {
private Object target;
public CalculatorProxy(Object target) {
this.target = target;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("Before method " + method.getName());
Object result = method.invoke(target, args);
System.out.println("After method " + method.getName());
return result;
}
}
public class Main {
public static void main(String[] args) {
Calculator calculator = new CalculatorImpl();
Calculator proxy = (Calculator) Proxy.newProxyInstance(
calculator.getClass().getClassLoader(),
calculator.getClass().getInterfaces(),
new CalculatorProxy(calculator));
int result = proxy.add(1, 2);
System.out.println("Result: " + result);
}
}
```
阅读全文