Java静态代理与动态代理demo
在Java编程中,代理模式是一种常用的结构型设计模式,它为其他对象提供一种代理以控制对这个对象的访问。代理模式通常用于增加额外的功能或在访问原始对象时进行额外的操作,比如日志记录、性能监控等。Java提供了两种实现代理模式的方式:静态代理和动态代理。 **静态代理** 静态代理是在编译时就已经确定了代理类,通过继承或实现目标接口来创建代理类。以下是一个简单的静态代理实现示例: ```java // 目标接口 interface Service { void doSomething(); } // 目标实现类 class RealService implements Service { @Override public void doSomething() { System.out.println("Real service doing something..."); } } // 静态代理类 class StaticProxy implements Service { private Service realService; public StaticProxy(Service realService) { this.realService = realService; } @Override public void doSomething() { // 在调用真实服务前执行额外操作 System.out.println("Static proxy before action..."); realService.doSomething(); // 在调用真实服务后执行额外操作 System.out.println("Static proxy after action..."); } } ``` 在上述代码中,`StaticProxy` 类实现了 `Service` 接口,并持有一个 `RealService` 的实例。当调用 `doSomething()` 方法时,代理类会在调用实际服务前后添加额外的行为。 **动态代理** 动态代理则是在运行时动态生成代理类,不需要在编译时知道具体的目标类。Java的 `java.lang.reflect.Proxy` 类和 `java.lang.reflect.InvocationHandler` 接口可以用来实现动态代理。 ```java // 动态代理示例 interface Service { void doSomething(); } // InvocationHandler 实现 class DynamicProxy implements InvocationHandler { private Object target; public DynamicProxy(Object target) { this.target = target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // 在调用方法前执行额外操作 System.out.println("Dynamic proxy before action..."); // 调用目标对象的方法 Object result = method.invoke(target, args); // 在调用方法后执行额外操作 System.out.println("Dynamic proxy after action..."); return result; } } // 测试代码 public class Main { public static void main(String[] args) { Service realService = new RealService(); Service dynamicProxy = (Service) Proxy.newProxyInstance( Service.class.getClassLoader(), new Class<?>[]{Service.class}, new DynamicProxy(realService) ); dynamicProxy.doSomething(); } } ``` 在动态代理中,我们创建了一个 `DynamicProxy` 类实现 `InvocationHandler` 接口,然后使用 `Proxy.newProxyInstance()` 方法创建代理对象。`invoke()` 方法会拦截所有对代理对象的方法调用,从而可以在调用前后添加额外逻辑。 总结来说,Java的静态代理和动态代理都能实现对目标对象的代理,但静态代理需要手动创建代理类,适用于目标类数量固定且已知的情况;而动态代理则在运行时生成代理类,更加灵活,尤其适合处理数量不确定或动态变化的目标类。在实际开发中,应根据项目需求选择合适的代理实现方式。
- 1
- 粉丝: 46
- 资源: 1
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助