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

相关文章

PyCharm如何设置新建文件默认为LF换行符

《PyCharm如何设置新建文件默认为LF换行符》:本文主要介绍PyCharm如何设置新建文件默认为LF换行符问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录PyCharm设置新建文件默认为LF换行符设置换行符修改换行符总结PyCharm设置新建文件默认为LF

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

使用Python实现获取网页指定内容

《使用Python实现获取网页指定内容》在当今互联网时代,网页数据抓取是一项非常重要的技能,本文将带你从零开始学习如何使用Python获取网页中的指定内容,希望对大家有所帮助... 目录引言1. 网页抓取的基本概念2. python中的网页抓取库3. 安装必要的库4. 发送HTTP请求并获取网页内容5. 解

Python使用date模块进行日期处理的终极指南

《Python使用date模块进行日期处理的终极指南》在处理与时间相关的数据时,Python的date模块是开发者最趁手的工具之一,本文将用通俗的语言,结合真实案例,带您掌握date模块的六大核心功能... 目录引言一、date模块的核心功能1.1 日期表示1.2 日期计算1.3 日期比较二、六大常用方法详

Python使用DrissionPage中ChromiumPage进行自动化网页操作

《Python使用DrissionPage中ChromiumPage进行自动化网页操作》DrissionPage作为一款轻量级且功能强大的浏览器自动化库,为开发者提供了丰富的功能支持,本文将使用Dri... 目录前言一、ChromiumPage基础操作1.初始化Drission 和 ChromiumPage

Linux上设置Ollama服务配置(常用环境变量)

《Linux上设置Ollama服务配置(常用环境变量)》本文主要介绍了Linux上设置Ollama服务配置(常用环境变量),Ollama提供了多种环境变量供配置,如调试模式、模型目录等,下面就来介绍一... 目录在 linux 上设置环境变量配置 OllamPOgxSRJfa手动安装安装特定版本查看日志在

C++常见容器获取头元素的方法大全

《C++常见容器获取头元素的方法大全》在C++编程中,容器是存储和管理数据集合的重要工具,不同的容器提供了不同的接口来访问和操作其中的元素,获取容器的头元素(即第一个元素)是常见的操作之一,本文将详细... 目录一、std::vector二、std::list三、std::deque四、std::forwa

使用Python高效获取网络数据的操作指南

《使用Python高效获取网络数据的操作指南》网络爬虫是一种自动化程序,用于访问和提取网站上的数据,Python是进行网络爬虫开发的理想语言,拥有丰富的库和工具,使得编写和维护爬虫变得简单高效,本文将... 目录网络爬虫的基本概念常用库介绍安装库Requests和BeautifulSoup爬虫开发发送请求解

Spring 中使用反射创建 Bean 实例的几种方式

《Spring中使用反射创建Bean实例的几种方式》文章介绍了在Spring框架中如何使用反射来创建Bean实例,包括使用Class.newInstance()、Constructor.newI... 目录1. 使用 Class.newInstance() (仅限无参构造函数):2. 使用 Construc

Android App安装列表获取方法(实践方案)

《AndroidApp安装列表获取方法(实践方案)》文章介绍了Android11及以上版本获取应用列表的方案调整,包括权限配置、白名单配置和action配置三种方式,并提供了相应的Java和Kotl... 目录前言实现方案         方案概述一、 androidManifest 三种配置方式