通过PropertyDescriptor反射进行字段名值的获取及设置

2024-06-01 01:48

本文主要是介绍通过PropertyDescriptor反射进行字段名值的获取及设置,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


/**
 * 根据属性名获取对应的value
 * @param fieldName
 * @param obj
 * @return
 * @throws Exception
 */
private static String getValueByFiled(String fieldName,Object obj)throws Exception{
       //属性扫描器
        PropertyDescriptor pd = new PropertyDescriptor(fieldName, obj.getClass());
        //从属性描述器中获取 get 方法
        Method method = pd.getReadMethod();
        //结果
        Object value = method.invoke(obj);
        //执行方法并返回结果
        return value==null?"":String.valueOf(value);
}

   

下面是比较完整的


public class PropertyUtil {  
@SuppressWarnings("unchecked")  
public static PropertyDescriptor getPropertyDescriptor(Class clazz, String propertyName) {  
StringBuffer sb = new StringBuffer();//构建一个可变字符串用来构建方法名称  
Method setMethod = null;  
Method getMethod = null;  
PropertyDescriptor pd = null;  
try {  
Field f = clazz.getDeclaredField(propertyName);//根据字段名来获取字段  
if (f!= null) {  
//构建方法的后缀  
String methodEnd = propertyName.substring(0, 1).toUpperCase() + propertyName.substring(1);  
sb.append("set" + methodEnd);//构建set方法  
setMethod = clazz.getDeclaredMethod(sb.toString(), new Class[]{ f.getType() });  
sb.delete(0, sb.length());//清空整个可变字符串  
sb.append("get" + methodEnd);//构建get方法  
//构建get 方法  
getMethod = clazz.getDeclaredMethod(sb.toString(), new Class[]{ });  
//构建一个属性描述器 把对应属性 propertyName 的 get 和 set 方法保存到属性描述器中  
pd = new PropertyDescriptor(propertyName, getMethod, setMethod);  
}  
} catch (Exception ex) {  
ex.printStackTrace();  
}  
return pd;  
}  
//对obj对象的指定字段进行值设置
@SuppressWarnings("unchecked")  
public static void setProperty(Object obj,String propertyName,Object value){  
Class clazz = obj.getClass();//获取对象的类型  
PropertyDescriptor pd = getPropertyDescriptor(clazz,propertyName);//获取 clazz 类型中的 propertyName 的属性描述器  
Method setMethod = pd.getWriteMethod();//从属性描述器中获取 set 方法  
try {  
setMethod.invoke(obj, new Object[]{value});//调用 set 方法将传入的value值保存属性中去  
}catch (Exception e){  
e.printStackTrace();  
}  
}  
//根据属性字段及对象获取对应的属性值	
@SuppressWarnings("unchecked")  
public static Object getProperty(Object obj, String propertyName){  
Class clazz = obj.getClass();//获取对象的类型  
PropertyDescriptor pd = getPropertyDescriptor(clazz,propertyName);//获取 clazz 类型中的 propertyName 的属性描述器  
Method getMethod = pd.getReadMethod();//从属性描述器中获取 get 方法  
Object value =null ;  
try {  
value = getMethod.invoke(clazz, new Object[]{});//调用方法获取方法的返回值  
} catch (Exception e) {  
e.printStackTrace();  
}  
return value;//返回值  
}  
}  
//调用
import java.beans.PropertyDescriptor;  
import java.lang.reflect.Field;  
import java.lang.reflect.Method;  
public class ReflectTest {  
public static void main(String[] args) throws Exception {  
Class clazz = Class.forName("TaskProvidePropsList");//这里的类名是全名。。有包的话要加上包名  
Object obj = clazz.newInstance();  
Field[] fields = clazz.getDeclaredFields();  
//写数据  
for(Field f : fields) {  
PropertyDescriptor pd = new PropertyDescriptor(f.getName(), clazz);  
Method wM = pd.getWriteMethod();//获得写方法  
wM.invoke(obj, 2);//因为知道是int类型的属性,所以传个int过去就是了。。实际情况中需要判断下他的参数类型  
}  
//读数据  
for(Field f : fields) {  
PropertyDescriptor pd = new PropertyDescriptor(f.getName(), clazz);  
Method rM = pd.getReadMethod();//获得读方法  
Integer num = (Integer) rM.invoke(obj);//因为知道是int类型的属性,所以转换成integer就是了。。也可以不转换直接打印  
System.out.println(num);  
}  
}  
}  


参考:http://blog.csdn.net/qq_34120041/article/details/53665526






这篇关于通过PropertyDescriptor反射进行字段名值的获取及设置的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1019647

相关文章

Python版本信息获取方法详解与实战

《Python版本信息获取方法详解与实战》在Python开发中,获取Python版本号是调试、兼容性检查和版本控制的重要基础操作,本文详细介绍了如何使用sys和platform模块获取Python的主... 目录1. python版本号获取基础2. 使用sys模块获取版本信息2.1 sys模块概述2.1.1

Java发送SNMP至交换机获取交换机状态实现方式

《Java发送SNMP至交换机获取交换机状态实现方式》文章介绍使用SNMP4J库(2.7.0)通过RCF1213-MIB协议获取交换机单/多路状态,需开启SNMP支持,重点对比SNMPv1、v2c、v... 目录交换机协议SNMP库获取交换机单路状态获取交换机多路状态总结交换机协议这里使用的交换机协议为常

Java实现为PDF设置背景色和背景图片

《Java实现为PDF设置背景色和背景图片》在日常的文档处理中,PDF格式因其稳定性和跨平台兼容性而广受欢迎,本文将深入探讨如何利用Spire.PDFforJava库,以简洁高效的方式为你的PDF文档... 目录库介绍与安装步骤Java 给 PDF 设置背景颜色Java 给 PDF 设置背景图片总结在日常的

C#中通过Response.Headers设置自定义参数的代码示例

《C#中通过Response.Headers设置自定义参数的代码示例》:本文主要介绍C#中通过Response.Headers设置自定义响应头的方法,涵盖基础添加、安全校验、生产实践及调试技巧,强... 目录一、基础设置方法1. 直接添加自定义头2. 批量设置模式二、高级配置技巧1. 安全校验机制2. 类型

MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决

《MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决》MyBatis默认开启一级缓存,同一事务中循环调用查询方法时会重复使用缓存数据,导致获取的序列主键值均为1,... 目录问题原因解决办法如果是存储过程总结问题myBATis有如下代码获取序列作为主键IdMappe

C#使用iText获取PDF的trailer数据的代码示例

《C#使用iText获取PDF的trailer数据的代码示例》开发程序debug的时候,看到了PDF有个trailer数据,挺有意思,于是考虑用代码把它读出来,那么就用到我们常用的iText框架了,所... 目录引言iText 核心概念C# 代码示例步骤 1: 确保已安装 iText步骤 2: C# 代码程

Python进行word模板内容替换的实现示例

《Python进行word模板内容替换的实现示例》本文介绍了使用Python自动化处理Word模板文档的常用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友... 目录技术背景与需求场景核心工具库介绍1.获取你的word模板内容2.正常文本内容的替换3.表格内容的

Spring Boot中获取IOC容器的多种方式

《SpringBoot中获取IOC容器的多种方式》本文主要介绍了SpringBoot中获取IOC容器的多种方式,包括直接注入、实现ApplicationContextAware接口、通过Spring... 目录1. 直接注入ApplicationContext2. 实现ApplicationContextA

python库pydantic数据验证和设置管理库的用途

《python库pydantic数据验证和设置管理库的用途》pydantic是一个用于数据验证和设置管理的Python库,它主要利用Python类型注解来定义数据模型的结构和验证规则,本文给大家介绍p... 目录主要特点和用途:Field数值验证参数总结pydantic 是一个让你能够 confidentl

Git进行版本控制的实战指南

《Git进行版本控制的实战指南》Git是一种分布式版本控制系统,广泛应用于软件开发中,它可以记录和管理项目的历史修改,并支持多人协作开发,通过Git,开发者可以轻松地跟踪代码变更、合并分支、回退版本等... 目录一、Git核心概念解析二、环境搭建与配置1. 安装Git(Windows示例)2. 基础配置(必