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来生成代理对象。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!