
静态代理与动态代理实例解析与应用
下载需积分: 14 | 6KB |
更新于2025-08-23
| 144 浏览量 | 举报
收藏
标题中提到的“静态代理和动态代理的例子”涉及到了面向对象编程中的设计模式——代理模式。代理模式是一种结构型设计模式,它为其他对象提供一种代理以控制对这个对象的访问。代理模式中比较典型的是静态代理和动态代理两种实现方式。接下来,我们将详细探讨这两种代理模式的特点、实现和应用场景。
静态代理是指在程序运行之前,代理类的.class文件就已经存在了。它主要依赖于编程人员在编译期就创建好代理类,代理类中包含了对实际对象的引用。静态代理因为代理类是在编译期就确定的,因此它通常是为特定的类创建的,具有更好的类型安全和性能,但它也有缺点,比如当需要代理的对象增多时,就需要创建更多的代理类,这导致了代码的膨胀。
动态代理则是在程序运行时动态地创建代理对象和代理类。它主要依赖于Java的反射机制和动态代理API。在Java中,可以使用java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口来实现动态代理。动态代理可以灵活地为不同的对象和类创建代理,无需为每个代理对象编写单独的代理类,因此它可以在不修改原有类代码的情况下对原有类进行增强。
接下来,我们以文件列表中的"static_proxy_demo"为参考,探讨静态代理的一个简单例子。
【静态代理例子】
假设我们有一个接口Image和它的实现类RealImage以及一个代理类ProxyImage。我们希望在调用RealImage类的方法之前或之后执行一些额外的操作,比如日志记录、权限检查等。
1. 首先定义Image接口:
```java
public interface Image {
void display();
}
```
2. 然后是RealImage类,它是Image接口的具体实现:
```java
public class RealImage implements Image {
private String fileName;
public RealImage(String fileName) {
this.fileName = fileName;
loadFromDisk(fileName);
}
public void display() {
System.out.println("Displaying " + fileName);
}
private void loadFromDisk(String fileName) {
System.out.println("Loading " + fileName);
}
}
```
3. 接下来创建静态代理类ProxyImage:
```java
public class ProxyImage implements Image {
private RealImage realImage;
private String fileName;
public ProxyImage(String fileName) {
this.fileName = fileName;
}
public void display() {
if (realImage == null) {
realImage = new RealImage(fileName);
}
preRequest();
realImage.display();
postRequest();
}
private void preRequest() {
System.out.println("Before proxy, do something, e.g., caching, logging.");
}
private void postRequest() {
System.out.println("After proxy, do something, e.g., clean up, release resource.");
}
}
```
4. 在客户端代码中,我们可以使用ProxyImage来代替RealImage:
```java
public class Client {
public static void main(String[] args) {
Image image = new ProxyImage("test_10mb.jpg");
image.display();
}
}
```
在这个例子中,ProxyImage类实现了Image接口,它在调用RealImage的display方法之前后分别添加了preRequest和postRequest方法的调用。这样,当我们调用display方法时,实际上就执行了三个方法,达到了代理的目的。
【动态代理例子】
在上面静态代理的基础上,如果我们不想为每个Image对象都编写一个代理类,那么我们可以使用动态代理来创建一个通用的代理类。
```java
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class DynamicProxyHandler implements InvocationHandler {
private Object originalObject;
public DynamicProxyHandler(Object originalObject) {
this.originalObject = originalObject;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("Before calling: " + method.getName());
Object result = method.invoke(originalObject, args);
System.out.println("After calling: " + method.getName());
return result;
}
public static Object newInstance(Object obj) {
return Proxy.newProxyInstance(
obj.getClass().getClassLoader(),
obj.getClass().getInterfaces(),
new DynamicProxyHandler(obj));
}
}
```
客户端代码将使用动态代理:
```java
public class Client {
public static void main(String[] args) {
Image image = (Image) DynamicProxyHandler.newInstance(new RealImage("test_10mb.jpg"));
image.display();
}
}
```
在这段代码中,我们没有直接创建一个代理类,而是通过`DynamicProxyHandler`类和`Proxy.newProxyInstance`方法动态生成了一个实现了Image接口的代理对象。这个代理对象在每个方法调用前后都会执行`DynamicProxyHandler`中的invoke方法,从而实现了一种通用的代理方式。
总结来说,静态代理和动态代理各有其适用场景。静态代理更加直观和简单,适用于代理目标已知且不经常变化的情况。动态代理则更为灵活和通用,适用于需要对一组接口或类进行代理的场景。了解它们的实现方式和应用场景,对于在实际开发中选择合适的代理策略非常有帮助。
相关推荐



















weixin_38669628
- 粉丝: 389
最新资源
- 智尊宝纺服装CAD制版软件v9.74:兼容Win7/10/11
- 多点温度测量系统设计与Labview仿真集成
- 802.11ac协议深度解析与智能设备无线互联
- 机器人控制系统设计与MATLAB仿真详解
- HTML5网页版跑酷小游戏实现教程
- EasyUI:轻量级高性能前端JavaScript框架解析
- 信息管理系统源码合集:【吐血推荐】全面整理分享
- MySQL 5.5.56版Win64位安装无需配置快速指南
- 专业局域网MAC扫描工具使用指南
- WinSoft OCR for .NET 5.5 源码下载与Delphi标签解析
- C++银行家算法完整代码包免费下载
- GRBL雕刻机上位机控制软件grblControl介绍
- 开源CMS系统DTcms5.0与移动模板发布
- 掌握Windbg高效排错:安装与案例解析
- ZK-RFID102 RFID SDK及其应用示例解析
- 2017年北京地铁16号线北段GIS数据包发布
- WebService CXF 服务端点项目快速导入eclipse运行指南
- 网络调试助手:TCP/UDP通信测试工具
- 深入浅出高性能MySQL第三版技术解析
- EJ_Technologies Exe4j 7.0.11 x86软件下载
- 人脸身份认证:云之眼服务端关键点提取指南
- MSP430F149单片机硬件封装压缩包下载
- Bootstrap制作的工业建筑企业网站模板
- 初学者适用的简单航班模拟程序设计