Java中动态代理和静态代理的区别案例
在Java中,动态代理(Dynamic Proxying)和静态代理(Static Proxying)是两种不同的代理实现方式。它们的主要区别体现在以下几个方面:
创建时机:
- 静态代理:在编译时确定代理类,生成的字节码包含代理代码。
- 动态代理:在运行时通过反射或Proxy对象动态生成代理类。
代理实现:
- 静态代理:通常使用一个抽象接口来定义代理方法。代理类实现了这个接口并重写了代理方法。
- 动态代理:通过反射技术,创建一个方法的引用,并在执行这个方法时,调用我们自定义的逻辑。
案例示例:
- 静态代理:
```java
// 定义抽象接口
public interface MyProxyable {
void doSomething();
}
// 静态代理类实现接口并重写
public class StaticProxy implements MyProxyable {
private final MyProxyable target;
public StaticProxy(MyProxyable target) {
this.target = target;
}
@Override
public void doSomething() {
System.out.println("Doing something via static proxy.");
target.doSomething();
}
}
// 使用静态代理
public class Main {
public static void main(String[] args) {
MyProxyable target = new StaticProxy(new ConcreteDoer()); // 用实际对象替换
target.doSomething(); // 调用代理方法
}
}
2. **动态代理**:
```java
// 定义抽象接口
public interface MyProxyable {
void doSomething();
}
// 动态代理类,通过反射实现
public class DynamicProxy implements MyProxyable {
private final MyProxyable target;
public DynamicProxy(MyProxyable target) {
this.target = target;
}
@Override
public void doSomething() {
System.out.println("Doing something via dynamic proxy.");
Method method = target.getClass().getMethod("doSomething")); // 使用反射获取目标方法
Proxy.invoke(target, new Object[]{}), method); // 调用代理对象的Proxy方法,执行动态代理
}
}
// 使用动态代理
public class Main {
public static void main(String[] args) {
MyProxyable target = new DynamicProxy(new ConcreteDoer()); // 用实际对象替换
target.doSomething(); // 调用代理方法
}
}
以上两种代理方式在实现目标功能的同时,也体现了Java中动态特性。
还没有评论,来说两句吧...