Java代理模式详解:静态代理与动态代理

需积分: 9 6 下载量 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开发人员来说是非常重要的,因为它们可以极大地提高代码的可扩展性和维护性。