动态代理
1、代理
以通俗方式理解
目标对象/被代理对象------房主:真正的租房方法
代理对象--------中介:有租房子的方法
执行代理对象方法的对象------租房的人
2、动态代理
不用手动编写一个代理对象,不需要编写与目标对象相同的方法,运行时在内存中动态生成代理对象。
生成动态代理的方法:
static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
1 package com.alphajuns.proxy; 2 3 public interface TargetInterface { 4 5 public abstract void method1(); 6 public abstract String method2(); 7 public abstract int method3(int x); 8 9 }
1 package com.alphajuns.proxy; 2 3 public class Target implements TargetInterface { 4 5 @Override 6 public void method1() { 7 System.out.println("method1 running ..."); 8 } 9 10 @Override 11 public String method2() { 12 System.out.println("method2 running ..."); 13 return "method2"; 14 } 15 16 @Override 17 public int method3(int x) { 18 System.out.println("method3 running ..."); 19 return x; 20 } 21 22 }
1 package com.alphajuns.proxy; 2 3 import java.lang.reflect.InvocationHandler; 4 import java.lang.reflect.Method; 5 import java.lang.reflect.Proxy; 6 7 import org.junit.Test; 8 9 public class ProxyTest { 10 11 @Test 12 public void test() { 13 // 获得动态代理对象,在程序运行时,在内存中动态的为Target创建一个虚拟的代理对象 14 TargetInterface objProxy = (TargetInterface) Proxy.newProxyInstance( 15 Target.class.getClassLoader(), 16 new Class[]{TargetInterface.class}, 17 new InvocationHandler() { 18 // invoke执行代理对象的方法 19 // method代表目标对象的方法字节码对象 20 // args代表目标对象相应的方法参数 21 @Override 22 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 23 System.out.println("目标对象方法前的逻辑"); 24 // 执行目标对象的方法 25 Object invoke = method.invoke(new Target(), args); 26 System.out.println("目标对象方法后的逻辑"); 27 return invoke; 28 } 29 } 30 ); 31 32 objProxy.method1(); 33 String method2 = objProxy.method2(); 34 System.out.println(method2); 35 } 36 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现