Java代理模式详解:静态代理与动态代理
需积分: 9 195 浏览量
更新于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 上传
2011-09-12 上传
2015-12-03 上传
点击了解资源详情
2023-11-15 上传
BorisCao
- 粉丝: 31
- 资源: 11
最新资源
- 达梦数据库DM8手册大全:安装、管理与优化指南
- Python Matplotlib库文件发布:适用于macOS的最新版本
- QPixmap小demo教程:图片处理功能实现
- YOLOv8与深度学习在玉米叶病识别中的应用笔记
- 扫码购物商城小程序源码设计与应用
- 划词小窗搜索插件:个性化搜索引擎与快速启动
- C#语言结合OpenVINO实现YOLO模型部署及同步推理
- AutoTorch最新包文件下载指南
- 小程序源码‘有调’功能实现与设计课程作品解析
- Redis 7.2.3离线安装包快速指南
- AutoTorch-0.0.2b版本安装教程与文件概述
- 蚁群算法在MATLAB上的实现与应用
- Quicker Connector: 浏览器自动化插件升级指南
- 京东白条小程序源码解析与实践
- JAVA公交搜索系统:前端到后端的完整解决方案
- C语言实现50行代码爱心电子相册教程