Java代理模式详解:静态代理与动态代理
需积分: 9 194 浏览量
更新于2024-09-25
收藏 36KB DOC 举报
"Java静态代理和动态代理是两种在Java编程中实现代理模式的方法,它们主要用来在不修改原有对象代码的情况下,增加额外的功能或控制对原对象的访问。代理模式使得我们可以在运行时或者编译时扩展目标类的功能,同时保持客户端代码的透明性。"
Java代理模式的核心在于代理类(Proxy Class)和委托类(Delegated Class),代理类充当委托类的中介,处理预处理、过滤和后处理任务。代理类和委托类通常需要实现相同的接口,以确保它们可以互相替换。
### 静态代理
静态代理是在编译时创建的,需要程序员手动编写代理类的源代码。以下是一个简单的静态代理实例:
1. 定义接口`HelloService`,包含`echo`和`getTime`两个方法。
```java
public interface HelloService {
public String echo(String msg);
public Date getTime();
}
```
2. 实现委托类`HelloServiceImpl`,具体实现`HelloService`接口的方法。
```java
public class HelloServiceImpl implements HelloService {
public String echo(String msg) {
return "echo: " + msg;
}
public Date getTime() {
return new Date();
}
}
```
3. 编写代理类`HelloServiceProxy`,同样实现`HelloService`接口,调用委托类的方法,并添加额外操作。
```java
public class HelloServiceProxy implements HelloService {
private HelloService helloService = new HelloServiceImpl();
public String echo(String msg) {
System.out.println("Before calling echo...");
String result = helloService.echo(msg);
System.out.println("After calling echo...");
return result;
}
public Date getTime() {
System.out.println("Before calling getTime...");
Date time = helloService.getTime();
System.out.println("After calling getTime...");
return time;
}
}
```
在这个例子中,`HelloServiceProxy`在调用`HelloServiceImpl`的`echo`和`getTime`方法之前和之后,分别添加了打印语句,这就是代理模式的基本应用。
### 动态代理
动态代理则是在运行时通过反射机制创建的,不需要预先编写代理类的源代码。Java提供了`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现动态代理。
1. 创建`InvocationHandler`实现类,处理代理对象的调用。
```java
public class DynamicHelloServiceHandler implements InvocationHandler {
private Object target;
public DynamicHelloServiceHandler(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("Before calling " + method.getName() + "...");
Object result = method.invoke(target, args);
System.out.println("After calling " + method.getName() + "...");
return result;
}
}
```
2. 在运行时,通过`Proxy.newProxyInstance()`创建动态代理对象。
```java
HelloService dynamicProxy = (HelloService) Proxy.newProxyInstance(
HelloService.class.getClassLoader(),
new Class[]{HelloService.class},
new DynamicHelloServiceHandler(new HelloServiceImpl()));
```
动态代理与静态代理相比,更具有灵活性,因为它可以在运行时根据需要创建代理对象,而且不需要为每个委托类都创建一个单独的代理类。
总结,Java静态代理和动态代理都是为了实现同样的目的,即在不修改委托类代码的情况下扩展功能或控制行为。静态代理适用于代理类相对固定的情况,而动态代理则适用于需要频繁创建不同代理对象,或者希望在运行时动态决定代理行为的场景。理解这两种代理方式对于Java开发人员来说是非常重要的,因为它们可以极大地提高代码的可扩展性和维护性。
2017-08-01 上传
2019-01-05 上传
2024-06-29 上传
2023-10-16 上传
2008-09-18 上传
2024-12-26 上传
2011-09-12 上传
2015-12-03 上传
点击了解资源详情
BorisCao
- 粉丝: 31
- 资源: 11