动态代理

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 }
复制代码

 

posted @   AlphaJunS  阅读(174)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示