java:PropertyDescriptor+反射调用setter方法

1 前言

PropertyDescriptor文档如下:

https://docs.oracle.com/javase/7/docs/api/java/beans/PropertyDescriptor.html

参考文档的构造方法细节:

public PropertyDescriptor(String propertyName,Class<?> beanClass)throws IntrospectionException
Constructs a PropertyDescriptor for a property that follows the standard Java convention by having getFoo and setFoo accessor methods. Thus if the argument name is "fred", it will assume that the writer method is "setFred" and the reader method is "getFred" (or "isFred" for a boolean property). Note that the property name should start with a lower case character, which will be capitalized in the method names.

实体类中的变量名按照小驼峰的写法规范命名,setter方法命名规范即可。

2 使用

package com.xiaoxu.tool;import com.google.common.collect.ImmutableMap;
import lombok.Data;import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;/*** @author xiaoxu* @date 2022-03-24* spring_boot:com.xiaoxu.tool.PropertyDescriptorTest*/
public class PropertyDescriptorTest {public static void main(String[] args) {PropertyDescriptorTest propertyDescriptorTest = new PropertyDescriptorTest();Map<String,Object> m = ImmutableMap.<String,Object>builder().put("num",1).put("number",3L).put("personName","xiaoxu").put("produceDate",new Date()).build();System.out.println(propertyDescriptorTest.test01(m, B.class));System.out.println(propertyDescriptorTest.test01(new HashMap<>(), B.class));}public <T> T test01(Map<String,Object> dataMap, Class<T> clazz){Field[] declaredFields = clazz.getDeclaredFields();T obj = null;try {obj  = clazz.newInstance();} catch (InstantiationException | IllegalAccessException e) {e.printStackTrace();}String methodName;for (Field declaredField : declaredFields) {try {methodName = declaredField.getName();PropertyDescriptor p = new PropertyDescriptor(methodName,clazz);Method writeMethod = p.getWriteMethod();if(dataMap.get(methodName)!=null){writeMethod.invoke(obj,dataMap.get(methodName));}} catch (IntrospectionException | IllegalAccessException | InvocationTargetException e) {e.printStackTrace();}}return obj;}
}@Data
class B{int num;long number;String personName;Date produceDate;
}

结果如下:

B(num=1, number=3, personName=xiaoxu, produceDate=Thu Mar 24 13:56:36 CST 2022)
B(num=0, number=0, personName=null, produceDate=null)

3 简单封装

package com.xiaoxu.utils.descriptor;import lombok.extern.slf4j.Slf4j;import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;/*** @author xiaoxu* @date 2022-04-27* spring_boot:com.xiaoxu.utils.descriptor.PropertyDescriptorUtil*/
@Slf4j
public class PropertyDescriptorUtil {public static <T> T writeDescriptor(T obj, Field field,Object value){Class<?> clazz = obj.getClass();try {PropertyDescriptor propertyDescriptor = new PropertyDescriptor(field.getName(),clazz);Method writeMethod = propertyDescriptor.getWriteMethod();writeMethod.invoke(obj,value);} catch (IntrospectionException | IllegalAccessException | InvocationTargetException e) {log.info(String.format("调用%s方法失败,clazz调用set赋值失败,原因:%s",Thread.currentThread().getStackTrace()[1].getMethodName(),e.getMessage()));}return obj;}public static <T> Object readDescriptor(T obj,Field field){Object read = null;Class<?> clazz = obj.getClass();try {PropertyDescriptor propertyDescriptor = new PropertyDescriptor(field.getName(),clazz);Method writeMethod = propertyDescriptor.getReadMethod();read = writeMethod.invoke(obj);} catch (IntrospectionException | IllegalAccessException | InvocationTargetException e) {log.info(String.format("调用%s方法失败,clazz调用get取值失败,原因:%s",Thread.currentThread().getStackTrace()[1].getMethodName(),e.getMessage()));}return read;}
}

java:PropertyDescriptor+反射调用setter方法相关推荐

  1. 使用PropertyDescriptor反射调用setter/getter方法

    有时候我们只知道一个对象的字段,我们想通过反射的方式将此字段赋值,可直接写反射又太浪费时间,还需要自己手动拼接方法名,而java为我们提供了一个很方便的类(PropertyDescriptor)来操作 ...

  2. java 反射调用get方法_Java通过PropertyDescriptor反射调用set和get方法

    本文实例为大家分享了PropertyDescriptor反射调用set和get方法,供大家参考,具体内容如下 第一段: package com.zhoushun; import java.lang.r ...

  3. java 反射 set方法_java 反射调用set方法

    Java语言中的许多库类名称,多与咖啡有关.下面是小编为您带来的java 反射调用set方法,希望对大家有所帮助. java 反射调用set方法: import java.beans.Property ...

  4. java 反射 调用私有构造函数_使用反射调用私有方法

    1.创建一个被调用的类 /** * @version 1.0 * @Author F-llin * @Date 2020-12-04 13:53 */ public class Bean{ priva ...

  5. Java中动态调用setter以及getter

    0x00 前言 对于非专业程序员的安全人员来说,因为没有代码项目的积累,很多知识体系都不完善,所以有必要在一些常用的内容进行学习的总结. 在很多的调用链中都会用到**"动态调用setter以 ...

  6. java 反射调用set方法_java反射调用set方法时如果让参数做自动类型转换

    这段时间学习java的反射机制想实现一个功能:遍历一个Map,然后利用反射机制调用BO的set方法,完成BO属性的自动注入.这样设计的初衷是解决Excel数据导入问题中的Map数据填充BO这一过程. ...

  7. 通过JAVA的反射调用类中的公有私有方法

    文章来源http://lavasoft.blog.51cto.com/62575/61002及http://blog.csdn.net/sunyujia/article/details/2501709 ...

  8. java中getter 和 setter 方法有什么意义?为什么不用public代替GS?

    知乎里的一个答案:https://www.zhihu.com/question/21401198 的确可以暴露,如果1. 所有内外代码都是你自己写:2. 这个模块再也不改了:3. 不会继承它,或者继承 ...

  9. 如何通过反射调用扩展方法?

    在某日回答MSDN客户问题的时候,碰到了一道对我而言新奇的题目(大牛们不要嘲笑俺,可能我少见多怪,写此文算是给出道着们遇到此类问题提一个醒) 题目如下: var list=new List<st ...

最新文章

  1. 1223: 输出汉诺塔问题的盘子移动步骤(Java)
  2. 教你用JS手写简单的秒表(精确到10ms,没有延迟)
  3. 谷歌利用OKR系统考核 脑力行业或可借鉴
  4. ElementUI弹出新增窗口
  5. Django基础11(Django中form表单)
  6. 算法高级(4)-遗传算法(Genetic Algorithm)简介
  7. 如何开始使用LightZone
  8. qt程序部署在linux,Qt应用打包发布,部署真正的Qt程序LinuxWindows-Go语言中文社区...
  9. C#中BackgroundWorker的介绍
  10. 客户端软件 大华_大华“飞燕”,一款主打稳定WiFi的路由器!
  11. 【缺陷识别】基于matlab GUI SVM金属表面缺陷分类与测量(带面板)【含Matlab源码 1652期】
  12. 怎样用计算机算百分之,win7使用自带计算器计算百分比的方法
  13. 【多目标优化算法】基于分解的多目标进化算法 MOEA/D
  14. 华硕win10键盘失灵_华硕键盘失灵一键修复的方法_win10华硕快捷键失灵的解决方法...
  15. 有趣的黑客网站 | 伪装成黑客高手,像电影黑客一样打字如飞
  16. 微软苏州校招笔试题目(1月10日)Colorful Lecture Note的解法
  17. 小程序源代码 古诗词
  18. 挂马攻击的介绍和防御
  19. java 不登录购物车_java-没有用户登录时存储购物车(playframework疑问)
  20. 7-24 猜数字游戏 (15分)

热门文章

  1. oracle中sql语句拼接单引号,oracle 单引号拼凑和动态sql
  2. python括号算法,在Python中生成括号模型列表的算法
  3. 使用cli安装uni-app后uni-ui的引入
  4. javaweb-青橙项目-5-80
  5. 用vps搭建 MediaWiki 百科程序
  6. 小熊电器:精品与创意,走上“顶流之路”的两把“宝剑”
  7. jar包的main入口
  8. Django web开发系列(二)图书借阅管理系统之模型设计
  9. Do Not Track(DNT)
  10. Python协程理解、基于爬虫举例