利用反射操作bean的属性和方法
今天在开发中碰到这样一个场景:当请求添加项目下的目录时,传过来的是一个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的属性和方法相关推荐
- spring 使用其他类protected方法_Java操作bean、属性、方法的使用工具类
在实际的项目开发中,反射操作类的实例.属性赋值.执行方法是常规的操作,虽然spring提供了比较完整的API来执行上述操作,不过在实际的应用中,spring的函数隐藏比较深,比较分散,小伙伴们可能懒得 ...
- 利用Lambda实现通过getter/setter方法引用拿到属性名
很多开发场景需要用到Java Bean的属性名,直接写死属性名字符串的形式容易产生bug(属性名一旦变化,IDE不会告诉你你的字符串需要同步修改).JDK8的Lambda可以通过方法引用简化代码,同样 ...
- 动态调用对象的属性和方法——性能和灵活性兼备的方法
在动态编程时,我们常常需要运行时确定调用对象的哪个属性或哪个方法.这个任务通常可以用反射来解决.但众所周知,反射的性能要比静态指定的方式低很多,因为反射要通过运行时复杂的机制完成.能否获得性能和灵活性 ...
- Spring问题研究之bean的属性xml注入List类型不匹配
一.问题描述 今天在Java群里看到"白日梦想家" 的一个提问,很有意思: 为什么 String类型的列表 通过spring的属性注入 可以注入Integer类型的元素呢? 二.问 ...
- 【JavaLearn】(19)反射、Class类、使用反射创建对象-操作属性-执行方法、泛型与反射、反射案例
目录 1. 反射 1.1 反射引入 1.2 反射的入口-Class类 2. 认识 Class 类 3. 使用反射创建对象 4. 使用反射操作属性 5. 使用反射执行方法 6. 使用反射操作泛型 6.2 ...
- 【JavaLearn】#(19)反射、Class类、使用反射创建对象-操作属性-执行方法、泛型与反射、反射案例
1. 反射 1.1 反射引入 编译时,知道类或对象的具体信息,此时直接对类和对象进行操作即可 编译时不知道类或对象的具体信息,只有运行时知道,需要使用反射来实现 ==> 比如驱动的类的名称放在 ...
- 怎么用python找论文_如何利用Python绘制学术论文图表方法
论文中图表形式多样,常用的处理工具有excel.MATLAB以及Python等,excel自处理的方法有两个缺陷: 1.当数据较多时,容易出现excel"翻白眼"的现象: 2.需要 ...
- 第60天:js常用访问CSS属性的方法
一. js 常用访问CSS 属性的方法 我们访问得到css 属性,比较常用的有两种: 1. 利用点语法 box.style.width box.style.top 点语法可以得到 ...
- beanUtils操作bean的属性
beanUtils操纵bean属性: 需要jar包commons-beanutils-x.x.x.jar 同时commons-beanutils-x.x.x.jar需要commons-logg ...
最新文章
- 清华团队综述全面解读图神经网络理论方法与应用
- python 气泡图 聚类_2015年度10大Plotly数据可视化美图及工具介绍
- python用raise手动抛出异常
- 如何办理夫妻间的房屋产权转移手续?
- verilog的学习
- chrome修改js数据怎么生效_chrome浏览器中 F12 功能的简单介绍
- 2.5 Go 算术运算与变量使用技巧
- VS2010生成的文件在别的机器上运行提示“丢失MSVCR100D.dll”
- JAVA调用 keras,在TensorFlow(Python, Java)环境下使用Keras模型
- android jni返回bitmap,JNI 层 Bitmap 转 OpenCV Mat
- 羞,Spring Bean 初始化/销毁竟然有这么多姿势
- 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_03 过滤器_2_FileNameFilter过滤器的使用和Lambda表达式...
- Shiro - Shiro简介;Shiro与Spring Security区别;Spring Boot集成Shiro
- 安卓实现百度地图定位
- (CVPR 2019) GSPN: Generative Shape Proposal Network for 3D Instance Segmentation in Point Cloud
- RQNOJ 341 星门跳跃【解题报告】
- android 点赞源码,【Ctrl.js】微信给最新一条消息点赞源码
- 【机器学习】为什么机器学习难于应用
- 简单的制作一个钓鱼网页!
- 数据结构的顺序表操作集
热门文章
- 利用VSCode阅读OpenFOAM源代码及其调试Debug【终极总结篇】
- ubuntu共享文件夹或文件等右下角一把锁的标志【终极解除右下角锁的方法】
- python 解压js压缩的图片_20行Python代码,无损压缩千百张图片!Python有多强!就不用说了...
- iphone7配置_iphone7黑屏开不了机怎么办
- php 文件写入磁盘错误,Linux磁盘读写故障的通常处理流程
- cvs数据导入工具 oracle_为中国企业打造的研发项目管理工具ONES Project已支持Jira数据导入...
- 1202此服务器的证书无效,ios - iOS:URLRequest错误域= NSURLErrorDomain代码= -1202“此服务器的证书无效 - 堆栈内存溢出...
- 12v60ah锂电池组装图_什么是自放电?如何缩短锂电池自放电测试时间?
- http抓包实战 pdf_实战 Wireshark https 抓包 2, 再抓 Moka 蹭 OurATS 的小尾巴
- 佳能g3800故障灯说明书_车子保养后跑了没多久跳出一个扳手样子的灯,是什么意思?...