今天在开发中碰到这样一个场景:当请求添加项目下的目录时,传过来的是一个IndexModel,这个Model里有关于这个目录字段的详细信息,包括基础报表,实时,漏斗等信息(这些字段类型都是boolean),对应于页面上生成目录的多选框。现要将这些配置存入数据库,在数据库中存的是这个项目下的目录,比如说在页面勾选了基础报表这个选择框,就会在数据库中的menu表插入一条数据记录这个配置。这样一来,就需要对传递过来的这个IndexModel类的属性值进行判断,再决定插入数据库的信息。

下面是IndexModel这个model的基本属性:

 1 public class IndexModel {
 2     private Boolean basic_report;  //基础报表
 3     private Boolean realtime;   //实时
 4     private Boolean event; //事件
 5     private Boolean retain;// 留存
 6     private Boolean funnel; //漏斗
 7     private Boolean explore; //探索
 8     private Boolean grouping; //分组
 9     private Boolean user_portrait; //用户画像
10     private Boolean log; //日志
11
12     //setters and getters ..
13 }

当某个属性为true时,则就会将这个属性配置进数据库,当这个属性为false时,则不会进行任何操作。

由此,我想到了利用Java反射,遍历这个类的属性,然后获取到这个属性的名字和值判断,再映射成数据库表的字段,插入到数据库中去。

我们先上解决方案代码:

 1  Field[] fields = IndexModel.class.getDeclaredFields();
 2             for (int i = 0; i < fields.length; i++) {
 3                     Field f = fields[i];
 4                     f.setAccessible(true); // 设置这些属性是可以访问的
 5                     try {
 6                        if(f.getGenericType().toString().endsWith("Boolean") && (Boolean) f.get(indexModel) == true) { // 得到此属性的值
 7                             IndexDto indexDto = parseIndexModelToDto(indexModel, f.getName());
 8                             projectService.addIndex(indexDto);
 9                         }
10                     } catch (IllegalAccessException e) {
11                         logger.error("属性类型转换异常");
12                     }
13                 }

在代码中先是利用反射获取类的所有对象成员的字段值,在这里由于IndexModel中的属性字段值都是private的,所以,只能使用 getDeclaredFields()获取到这些字段,至于getFields()方法,只能获取到类(及其父类)中的公有成员,这两个方法返回的都是Field类型的数组。

在获取私有成员值之前,必须调用setAccessible(true),否则的话,将会抛出异常:java.lang.IllegalAccessException:  class... can not access ,显示不能获取字段值。

另外,在需要获取成员的类型时,需要调用相应的field的getType()方法,获取field的类型有如下几种方法

1  Class<?> type = field.getType();        // 通过这种方式只对普通类型的Field有效,如果该Field的类型是有泛型限制的类型,如Map<String,Integer>类型,则不能准确得到该Field的泛型参数。
2
3  Type type = field.getGenericType();  // 为了获得指定Field的泛型类型,应该使用这个方法来获取指定Field的泛型类型

如果要获取上面对应field的被泛型限制的方法,就需要将上面的type对象强制类型转换成ParameterizedType对象,ParameterizedType代表被参数化的类型,也就是增加了泛型限制的类型,ParameterizedType类提供了两个方法:

getRawType();                            返回被泛型限制的类型;

getActualTypeArguments();        返回泛型参数类型。

然后,要获取成员变量的名称直接使用field.getName(),但是属性值则是field.get(Object),这个object是该field所属的!

最后,要是想为这个成员变量设置值,则需要调用set:field[i].set(indexModel , true);

转载于:https://www.cnblogs.com/jy107600/p/7150976.html

利用反射操作bean的属性和方法相关推荐

  1. spring 使用其他类protected方法_Java操作bean、属性、方法的使用工具类

    在实际的项目开发中,反射操作类的实例.属性赋值.执行方法是常规的操作,虽然spring提供了比较完整的API来执行上述操作,不过在实际的应用中,spring的函数隐藏比较深,比较分散,小伙伴们可能懒得 ...

  2. 利用Lambda实现通过getter/setter方法引用拿到属性名

    很多开发场景需要用到Java Bean的属性名,直接写死属性名字符串的形式容易产生bug(属性名一旦变化,IDE不会告诉你你的字符串需要同步修改).JDK8的Lambda可以通过方法引用简化代码,同样 ...

  3. 动态调用对象的属性和方法——性能和灵活性兼备的方法

    在动态编程时,我们常常需要运行时确定调用对象的哪个属性或哪个方法.这个任务通常可以用反射来解决.但众所周知,反射的性能要比静态指定的方式低很多,因为反射要通过运行时复杂的机制完成.能否获得性能和灵活性 ...

  4. Spring问题研究之bean的属性xml注入List类型不匹配

    一.问题描述 今天在Java群里看到"白日梦想家" 的一个提问,很有意思: 为什么 String类型的列表 通过spring的属性注入 可以注入Integer类型的元素呢? 二.问 ...

  5. 【JavaLearn】(19)反射、Class类、使用反射创建对象-操作属性-执行方法、泛型与反射、反射案例

    目录 1. 反射 1.1 反射引入 1.2 反射的入口-Class类 2. 认识 Class 类 3. 使用反射创建对象 4. 使用反射操作属性 5. 使用反射执行方法 6. 使用反射操作泛型 6.2 ...

  6. 【JavaLearn】#(19)反射、Class类、使用反射创建对象-操作属性-执行方法、泛型与反射、反射案例

    1. 反射 1.1 反射引入 编译时,知道类或对象的具体信息,此时直接对类和对象进行操作即可 编译时不知道类或对象的具体信息,只有运行时知道,需要使用反射来实现 ==> 比如驱动的类的名称放在 ...

  7. 怎么用python找论文_如何利用Python绘制学术论文图表方法

    论文中图表形式多样,常用的处理工具有excel.MATLAB以及Python等,excel自处理的方法有两个缺陷: 1.当数据较多时,容易出现excel"翻白眼"的现象: 2.需要 ...

  8. 第60天:js常用访问CSS属性的方法

    一. js 常用访问CSS 属性的方法 我们访问得到css 属性,比较常用的有两种: 1. 利用点语法  box.style.width      box.style.top     点语法可以得到 ...

  9. beanUtils操作bean的属性

    beanUtils操纵bean属性: 需要jar包commons-beanutils-x.x.x.jar     同时commons-beanutils-x.x.x.jar需要commons-logg ...

最新文章

  1. 清华团队综述全面解读图神经网络理论方法与应用
  2. python 气泡图 聚类_2015年度10大Plotly数据可视化美图及工具介绍
  3. python用raise手动抛出异常
  4. 如何办理夫妻间的房屋产权转移手续?
  5. verilog的学习
  6. chrome修改js数据怎么生效_chrome浏览器中 F12 功能的简单介绍
  7. 2.5 Go 算术运算与变量使用技巧
  8. VS2010生成的文件在别的机器上运行提示“丢失MSVCR100D.dll”
  9. JAVA调用 keras,在TensorFlow(Python, Java)环境下使用Keras模型
  10. android jni返回bitmap,JNI 层 Bitmap 转 OpenCV Mat
  11. 羞,Spring Bean 初始化/销毁竟然有这么多姿势
  12. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_03 过滤器_2_FileNameFilter过滤器的使用和Lambda表达式...
  13. Shiro - Shiro简介;Shiro与Spring Security区别;Spring Boot集成Shiro
  14. 安卓实现百度地图定位
  15. (CVPR 2019) GSPN: Generative Shape Proposal Network for 3D Instance Segmentation in Point Cloud
  16. RQNOJ 341 星门跳跃【解题报告】
  17. android 点赞源码,【Ctrl.js】微信给最新一条消息点赞源码
  18. 【机器学习】为什么机器学习难于应用
  19. 简单的制作一个钓鱼网页!
  20. 数据结构的顺序表操作集

热门文章

  1. 利用VSCode阅读OpenFOAM源代码及其调试Debug【终极总结篇】
  2. ubuntu共享文件夹或文件等右下角一把锁的标志【终极解除右下角锁的方法】
  3. python 解压js压缩的图片_20行Python代码,无损压缩千百张图片!Python有多强!就不用说了...
  4. iphone7配置_iphone7黑屏开不了机怎么办
  5. php 文件写入磁盘错误,Linux磁盘读写故障的通常处理流程
  6. cvs数据导入工具 oracle_为中国企业打造的研发项目管理工具ONES Project已支持Jira数据导入...
  7. 1202此服务器的证书无效,ios - iOS:URLRequest错误域= NSURLErrorDomain代码= -1202“此服务器的证书无效 - 堆栈内存溢出...
  8. 12v60ah锂电池组装图_什么是自放电?如何缩短锂电池自放电测试时间?
  9. http抓包实战 pdf_实战 Wireshark https 抓包 2, 再抓 Moka 蹭 OurATS 的小尾巴
  10. 佳能g3800故障灯说明书_车子保养后跑了没多久跳出一个扳手样子的灯,是什么意思?...