Java设计模式动态代理

https://blog.csdn.net/swadian2008/article/details/127126065

 

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public interface Hello {
  void sayHello();
}

public class HelloImpl implements Hello {
  @Override
  public void sayHello() {
    System.out.println("Hello World!");
  }
}

public class LogHandler implements InvocationHandler {
private Object target;

public LogHandler(Object target) {
this.target = target;
}

@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
  System.out.println("Before method " + method.getName());
  Object result = method.invoke(target, args);
  System.out.println("After method " + method.getName());
  return result;
}
}

public class Main {
public static void main(String[] args) {
  Hello hello = new HelloImpl();
  InvocationHandler handler = new LogHandler(hello);
  Hello proxyHello = (Hello) Proxy.newProxyInstance(hello.getClass().getClassLoader(), hello.getClass().getInterfaces(), handler);
  proxyHello.sayHello();
}
}

 

动态代理是一种更加灵活的代理模式,它不需要手动创建代理类,而是在运行时动态地生成代理对象。Java中动态代理是通过反射机制实现的,它允许我们在运行时创建一个代理对象,并将方法调用转发到原始对象上。动态代理通常需要实现一个InvocationHandler接口,该接口中有一个invoke方法,用于处理方法调用。// 动态代理的核心在于动态生成代理类

在这个例子中,我们定义了一个Hello接口和一个HelloImpl类作为被代理类,实现了InvocationHandler接口的LogHandler类作为代理类。在LogHandler类的invoke方法中,我们添加了一些日志信息,并通过反射调用了原始对象的对应方法。在Main类中,我们使用Proxy类的静态方法newProxyInstance来生成一个代理对象。这个方法接受三个参数:类加载器、被代理类实现的接口、和代理类的InvocationHandler实例。通过调用代理对象的sayHello方法,我们可以看到在调用被代理对象的sayHello方法前后输出了一些日志信息。

总的来说,动态代理是一种非常有用的代理方式,它可以帮助我们更加灵活地控制对原始对象的访问,并在其中添加一些额外的功能。在Java中,我们可以使用动态代理来实现这种功能,通过实现InvocationHandler接口来自定义代理类的行为,并通过Proxy类的静态方法newProxyInstance来生成代理对象。

 

posted @   northli  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示