Java 动态代理机制

devtools/2024/10/18 0:13:55/

可以通过 Java 动态代理机制来实现一个通用的代理类,使它能够处理任意接口中包含的 setget 方法,并且将属性值保存在一个内部的 Map 中。这样,每次调用 set 方法时,值会被存储到 Map 中,而调用 get 方法时,则会从 Map 中获取值。

下面是一个通用的解决方案:

1. 创建通用接口 XXX

java">public interface XXX {void setProperty(String value);String getProperty();
}

2. 创建 InvocationHandler 实现

我们将使用一个 Map<String, Object> 来存储属性值,其中键是属性名,值是对应的属性值。

java">import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;public class PropertyInvocationHandler implements InvocationHandler {private Map<String, Object> properties = new HashMap<>();@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {String methodName = method.getName();// 检测是否是set方法if (methodName.startsWith("set") && args != null && args.length == 1) {String propertyName = methodName.substring(3); // 获取属性名properties.put(propertyName, args[0]); // 保存属性值到 Map 中return null;}// 检测是否是get方法if (methodName.startsWith("get") && args == null) {String propertyName = methodName.substring(3); // 获取属性名return properties.get(propertyName); // 从 Map 中获取属性值}throw new UnsupportedOperationException("Unsupported method: " + methodName);}
}

3. 通过代理实例化接口

使用 Proxy.newProxyInstance 来动态代理实现接口 XXX

java">import java.lang.reflect.Proxy;public class ProxyDemo {public static void main(String[] args) {// 创建处理器PropertyInvocationHandler handler = new PropertyInvocationHandler();// 创建代理对象XXX proxyInstance = (XXX) Proxy.newProxyInstance(XXX.class.getClassLoader(),new Class<?>[]{XXX.class},handler);// 测试代理对象的 set 和 get 方法proxyInstance.setProperty("Hello, World!");String value = proxyInstance.getProperty();System.out.println("Property Value: " + value); // 输出: Property Value: Hello, World!}
}

解释:

  1. PropertyInvocationHandler:实现了 InvocationHandler 接口,通过 invoke 方法拦截所有对 setget 方法的调用。
    • 如果方法名以 set 开头,将属性名和属性值保存到 Map<String, Object> 中。
    • 如果方法名以 get 开头,则从 Map 中取出对应的属性值并返回。
  2. 代理对象创建:通过 Proxy.newProxyInstance 创建了 XXX 接口的代理实例。
  3. 使用代理对象:可以通过代理对象调用 setPropertygetProperty 方法,设置和获取属性值。

通用性:

这个实现是通用的,可以适用于任何包含 setget 方法的接口。无论属性名是什么,只要是以 setget 开头的方法,都可以通过这个代理来处理。

运行结果:

Property Value: Hello, World!

扩展:

如果接口中包含多个属性(例如 setNamegetNamesetAgegetAge 等),该代码同样有效。属性名可以通过截取方法名的前缀来自动处理。

java">public interface Person {void setName(String name);String getName();void setAge(int age);int getAge();
}
java">public class ProxyPersonDemo {public static void main(String[] args) {PropertyInvocationHandler handler = new PropertyInvocationHandler();Person personProxy = (Person) Proxy.newProxyInstance(Person.class.getClassLoader(),new Class<?>[]{Person.class},handler);personProxy.setName("Alice");personProxy.setAge(25);System.out.println("Name: " + personProxy.getName());  // 输出: Name: AliceSystem.out.println("Age: " + personProxy.getAge());    // 输出: Age: 25}
}

这样,动态代理可以灵活处理多个 setget 方法,非常适合场景中使用属性接口的场合。


http://www.ppmy.cn/devtools/126589.html

相关文章

Android应用性能优化的方法

Android应用性能优化是一个复杂而关键的过程&#xff0c;涉及多个方面&#xff0c;包括布局优化、网络优化、安装包优化、内存优化、卡顿优化、启动优化等。以下是对这些优化方法的详细解析&#xff1a; 一、布局优化 布局优化是Android性能优化的基础&#xff0c;主要目标是…

H.266都来了,为什么感觉H.265标准还没普及?

技术背景 H.266&#xff0c;也被称为多功能视频编码&#xff08;Versatile Video Coding&#xff0c;简称 VVC&#xff09;是最新一代视频编码标准&#xff0c;2020 年 7 月定稿&#xff0c;ITU 第一版于当年 11 月正式发布&#xff0c;ISO/IEC 第一版于 2021 年 2 月正式发布…

蛋白质结构中的pdb_strand_id 和 pdbx_strand_id

在蛋白质结构文件&#xff08;如 .cif 文件&#xff09;中&#xff0c;pdb_strand_id 和 pdbx_strand_id 不是同一个概念&#xff0c;它们分别指代不同的字段&#xff0c;具有不同的含义。 1. pdb_strand_id: 这个术语通常在 PDB 数据库的老版本中使用&#xff0c;是指蛋白质…

springboot项目多个数据源配置 dblink

当项目中涉及到多个数据库连接的时候该如何处理&#xff1f; 在对应的配置文件&#xff0c;配置对应的数据库情况&#xff0c;不过我确实没咋测试对于事务的处理我可以后续在多做测试 配置文件中配置对应的数据源 然后再使用的时候使用这个 DS(“pd_ob”)注解。 然后又长知识…

3.3 Thymeleaf语法

文章目录 引言Thymeleaf标签显示标签链接地址标签条件判断标签元素遍历标签 Thymeleaf表达式变量表达式选择变量表达式消息表达式链接表达式 Thymeleaf内置对象上下文对象上下文变量上下文区域请求对象响应对象会话对象日期对象 实战演练创建控制器创建模板页面 结语 引言 Thy…

三、AOP

文章目录 1. AOP&#xff08;概念&#xff09;2. AOP&#xff08;底层原理&#xff09;2.1 AOP 底层使用动态代理2.2 AOP&#xff08;JDK动态代理&#xff09; 3. AOP&#xff08;术语&#xff09;3.1 连接点3.2 切入点3.3 通知&#xff08;增强&#xff09;3.4 切面 4. AOP操作…

基于华为云智慧生活生态链设计的智能鱼缸

一. 引言 1.1 项目背景 随着智能家居技术的发展和人们对高品质生活的追求日益增长&#xff0c;智能鱼缸作为一种结合了科技与自然美的家居装饰品&#xff0c;正逐渐成为智能家居领域的新宠。本项目旨在设计一款基于华为云智慧生活生态链的智能鱼缸&#xff0c;它不仅能够提供…

【哈工大_操作系统理论】L2223 多级页表与快表段页结合的实际内存管理

L3.3 多级页表与快表 一页大小是4K&#xff0c;最大的浪费其实就是一页都空着&#xff0c;所以最大浪费是4K。则为了避免浪费&#xff0c;页大小必须小一些。 1、问题&#xff1a;需要很大内存空间存放页表 一般内存大小为4G&#xff0c;页大小为4K&#xff0c;则有1M个页表象…