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

相关文章

SpringBoot结合Docker进行容器化处理指南

《SpringBoot结合Docker进行容器化处理指南》在当今快速发展的软件工程领域,SpringBoot和Docker已经成为现代Java开发者的必备工具,本文将深入讲解如何将一个SpringBo... 目录前言一、为什么选择 Spring Bootjavascript + docker1. 快速部署与

linux解压缩 xxx.jar文件进行内部操作过程

《linux解压缩xxx.jar文件进行内部操作过程》:本文主要介绍linux解压缩xxx.jar文件进行内部操作,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、解压文件二、压缩文件总结一、解压文件1、把 xxx.jar 文件放在服务器上,并进入当前目录#

SpringBoot中如何使用Assert进行断言校验

《SpringBoot中如何使用Assert进行断言校验》Java提供了内置的assert机制,而Spring框架也提供了更强大的Assert工具类来帮助开发者进行参数校验和状态检查,下... 目录前言一、Java 原生assert简介1.1 使用方式1.2 示例代码1.3 优缺点分析二、Spring Fr

java中反射Reflection的4个作用详解

《java中反射Reflection的4个作用详解》反射Reflection是Java等编程语言中的一个重要特性,它允许程序在运行时进行自我检查和对内部成员(如字段、方法、类等)的操作,本文将详细介绍... 目录作用1、在运行时判断任意一个对象所属的类作用2、在运行时构造任意一个类的对象作用3、在运行时判断

Python使用OpenCV实现获取视频时长的小工具

《Python使用OpenCV实现获取视频时长的小工具》在处理视频数据时,获取视频的时长是一项常见且基础的需求,本文将详细介绍如何使用Python和OpenCV获取视频时长,并对每一行代码进行深入解析... 目录一、代码实现二、代码解析1. 导入 OpenCV 库2. 定义获取视频时长的函数3. 打开视频文

linux hostname设置全过程

《linuxhostname设置全过程》:本文主要介绍linuxhostname设置全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录查询hostname设置步骤其它相关点hostid/etc/hostsEDChina编程A工具license破解注意事项总结以RHE

Python设置Cookie永不超时的详细指南

《Python设置Cookie永不超时的详细指南》Cookie是一种存储在用户浏览器中的小型数据片段,用于记录用户的登录状态、偏好设置等信息,下面小编就来和大家详细讲讲Python如何设置Cookie... 目录一、Cookie的作用与重要性二、Cookie过期的原因三、实现Cookie永不超时的方法(一)

Golang如何对cron进行二次封装实现指定时间执行定时任务

《Golang如何对cron进行二次封装实现指定时间执行定时任务》:本文主要介绍Golang如何对cron进行二次封装实现指定时间执行定时任务问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录背景cron库下载代码示例【1】结构体定义【2】定时任务开启【3】使用示例【4】控制台输出总结背景

MySQL 获取字符串长度及注意事项

《MySQL获取字符串长度及注意事项》本文通过实例代码给大家介绍MySQL获取字符串长度及注意事项,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql 获取字符串长度详解 核心长度函数对比⚠️ 六大关键注意事项1. 字符编码决定字节长度2

python3如何找到字典的下标index、获取list中指定元素的位置索引

《python3如何找到字典的下标index、获取list中指定元素的位置索引》:本文主要介绍python3如何找到字典的下标index、获取list中指定元素的位置索引问题,具有很好的参考价值,... 目录enumerate()找到字典的下标 index获取list中指定元素的位置索引总结enumerat