通过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

相关文章

Linux下如何使用C++获取硬件信息

《Linux下如何使用C++获取硬件信息》这篇文章主要为大家详细介绍了如何使用C++实现获取CPU,主板,磁盘,BIOS信息等硬件信息,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录方法获取CPU信息:读取"/proc/cpuinfo"文件获取磁盘信息:读取"/proc/diskstats"文

Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案

《Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案》:本文主要介绍Vue3组件中getCurrentInstance()获取App实例,但是返回nu... 目录vue3组件中getCurrentInstajavascriptnce()获取App实例,但是返回n

QT进行CSV文件初始化与读写操作

《QT进行CSV文件初始化与读写操作》这篇文章主要为大家详细介绍了在QT环境中如何进行CSV文件的初始化、写入和读取操作,本文为大家整理了相关的操作的多种方法,希望对大家有所帮助... 目录前言一、CSV文件初始化二、CSV写入三、CSV读取四、QT 逐行读取csv文件五、Qt如何将数据保存成CSV文件前言

SpringMVC获取请求参数的方法

《SpringMVC获取请求参数的方法》:本文主要介绍SpringMVC获取请求参数的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下... 目录1、通过ServletAPI获取2、通过控制器方法的形参获取请求参数3、@RequestParam4、@

C#TextBox设置提示文本方式(SetHintText)

《C#TextBox设置提示文本方式(SetHintText)》:本文主要介绍C#TextBox设置提示文本方式(SetHintText),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录C#TextBox设置提示文本效果展示核心代码总结C#TextBox设置提示文本效果展示核心代

通过Spring层面进行事务回滚的实现

《通过Spring层面进行事务回滚的实现》本文主要介绍了通过Spring层面进行事务回滚的实现,包括声明式事务和编程式事务,具有一定的参考价值,感兴趣的可以了解一下... 目录声明式事务回滚:1. 基础注解配置2. 指定回滚异常类型3. ​不回滚特殊场景编程式事务回滚:1. ​使用 TransactionT

Java中使用Hutool进行AES加密解密的方法举例

《Java中使用Hutool进行AES加密解密的方法举例》AES是一种对称加密,所谓对称加密就是加密与解密使用的秘钥是一个,下面:本文主要介绍Java中使用Hutool进行AES加密解密的相关资料... 目录前言一、Hutool简介与引入1.1 Hutool简介1.2 引入Hutool二、AES加密解密基础

Pyserial设置缓冲区大小失败的问题解决

《Pyserial设置缓冲区大小失败的问题解决》本文主要介绍了Pyserial设置缓冲区大小失败的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录问题描述原因分析解决方案问题描述使用set_buffer_size()设置缓冲区大小后,buf

Python获取C++中返回的char*字段的两种思路

《Python获取C++中返回的char*字段的两种思路》有时候需要获取C++函数中返回来的不定长的char*字符串,本文小编为大家找到了两种解决问题的思路,感兴趣的小伙伴可以跟随小编一起学习一下... 有时候需要获取C++函数中返回来的不定长的char*字符串,目前我找到两种解决问题的思路,具体实现如下:

SpringSecurity6.0 如何通过JWTtoken进行认证授权

《SpringSecurity6.0如何通过JWTtoken进行认证授权》:本文主要介绍SpringSecurity6.0通过JWTtoken进行认证授权的过程,本文给大家介绍的非常详细,感兴趣... 目录项目依赖认证UserDetailService生成JWT token权限控制小结之前写过一个文章,从S