当前位置: 首页 > news >正文

深圳建模板网站万州哪里有做网站的

深圳建模板网站,万州哪里有做网站的,大淘客做的网站可以吗,社群电商平台排名背景: 在一次使用easyExcel.read 读取excel时#xff0c;发现实体类字段没有值#xff0c;在反复测试后#xff0c;发现去掉Accessors(chain true)就正常了#xff0c;为了验证原因#xff0c;进行了一次代码跟踪 由于调用链路特别长#xff0c;只列举出部分代码#x… 背景: 在一次使用easyExcel.read 读取excel时发现实体类字段没有值在反复测试后发现去掉Accessors(chain true)就正常了为了验证原因进行了一次代码跟踪 由于调用链路特别长只列举出部分代码 感兴趣的同学通过断点及前后的堆栈信息可以自己追踪到中间代码。 DTO代码(开启了chain ) HeadRowHeight(30) ContentRowHeight(20) Data() Accessors(chain true) public class EasyExcelDTO {ColumnWidth(30)ExcelProperty(标题)private String title;ColumnWidth(30)ExcelProperty(内容)private String content;} 读取excel代码示例 ListEasyExcelDTO res new ArrayList();EasyExcel.read(file, EasyExcelDTO.class, new AnalysisEventListenerEasyExcelDTO() {Overridepublic void invoke(EasyExcelDTO o, AnalysisContext analysisContext) {res.add(o);}Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {}}).sheet().doRead();System.out.println(res);首先我们从doRead()方法点进去 ExcelReaderSheetBuilder类的doRead()方法 接着连续点几次read()方法 过程略 接下来可以看到如下代码 省略一系列中间步骤 可自行通过前后断点 看到中间堆栈链路 接下来可以看到DefaultAnalysisEventProcessor类中 readListener监听的invoke方法 ModelBuildEventListener类的buildUserModel方法 下图中的resultModel就是我们的实体类对象 接着就是一系列的convert操作: ConverterUtils类doConvertToJavaObject方法 接下来的重点来了 还是在ModelBuildEventListener类的buildUserModel方法中最后有两行, 为什么会盯上这两行代码呢 因为这里返回去 字段没有值意味着这个步骤出现了问题也正是从这里开始 与阿里无关阿里成功甩锅接下来就是使用的cglib的代码了 BeanMap.create(resultModel).putAll(map);return resultModel; 从这里开始 我们可以不用分析easyExcel的代码了我们的demo也可以转换为 (因为没有监听 更方便调试) EasyExcelDTO easyExcelDTO new EasyExcelDTO();MapString, String map new HashMap();// DTO里面有title字段map.put(title,1);// 相当于bean拷贝 (下面这行是cglib里面的代码)BeanMap.create(easyExcelDTO).putAll(map);System.out.println(easyExcelDTO);putAll只是个赋值所以我们看cglib包下的BeanMap类的 create()方法 跟踪的难点 难就难在不知道到底哪个步骤对bean进行操作 接下来是AbstractClassGenerator类的create方法 再接下来是ReflectUtils类的getPropertiesHelper方法 为什么会找到这个方法 因为它被getBeanSetters方法调用而bean拷贝赋值 大概率就是通过set方法去设置值的也就是说问题可能出在set方法里面 从这里开始调用的就是java.desktop包下的代码了 通俗点说也就是jdk源码 接下来是Introspector类的processPropertyDescriptors()方法 再紧接着就是PropertyDescriptor类的构造方法了 有些代码逻辑 不管是get 还是set方法 都会执行一遍 因为我断点只打在了下图setters 上面是get方法的步骤 其实在之前的步骤中 还需要经过cglib BeanMapEmitter类的构造方法 (set流程也是类似的) 我们可以看到关键的一行代码 Map setters this.makePropertyMap(ReflectUtils.getBeanSetters(type)); 这边就是获取set方法map了那如果这个map没有内容 是不是说明我们错过了什么调试步骤呢我们需要做的应该是往上游找代码 没必要继续往下跟源码了 我们代码跟下来似乎信息都是在 entry里面我们往上翻两步可以看到下列代码 PropertyInfo info entry.getValue();setName(Introspector.decapitalize(base));setReadMethod0(info.getReadMethod());setWriteMethod0(info.getWriteMethod());于是我们再次回到这个方法 Introspector类的processPropertyDescriptors()方法 光标这行代码中 有个.getProperties()方法 , 我们点进去看看 , 进入到了ClassInfo类中 有个get方法 进入上图红框的get方法来到了PropertyInfo类的get方法至此真相大白 针对set方法的返回值做了判断如果不为空 writeList就不会赋值 就找不到写入set相关的方法 上面我们分析的是create方法 我们接下来简单看一下put方法 // BeanMap.create(easyExcelDTO).putAll(map)BeanMap类的putAll方法 最终是一个抽象方法那么我们可以想到 这里是用了动态代理去实现 红框中var1是bean, bean是由我们DTO对象转换来的var2 var3分别是k v, 不难猜测这个方法里面是对bean进行赋值 我们可以通过artuas 看一下代理对象中 put方法赋值做了什么 tips:如何寻找代理对象 我们通过put方法 不难看出 是给DTObean赋值意味着我们的DTO对象可能被代理了 启动arthuas 输入命令 dump *EasyExcelDTO*果然发现了代理对象 接着通过jad 命令输入全路径类名即可 开启了chain 我们可以看到put方法里面没有set的步骤 关闭chain之后 有set步骤 总结 完整调用链路中 涉及到 ReflectUtils 和 BaseMap 类比较多工具框架都可能使用到这些代码出现问题时通常会先尝试找各种原因 花大量时间排除其它原因导致的 比较难想到是因为set方法有返回值导致的。
http://www.hkea.cn/news/14421406/

相关文章:

  • 有源码怎么做网站初学者想学网站建设
  • ps怎么制作网页马鞍山seo
  • 郑州建设网站的公司湖北建站
  • 门户网站html模板商城网站设计费用
  • 网站建设吉金手指排名15北京服装设计公司排名前十强
  • 网站设计论文致谢网站制作复杂吗
  • 建设银行etc的网站是哪个好四川省建筑施工企业安全员考试
  • 重庆网站seo建设中国建筑门户网
  • 做网站收费标准点击量网站关键词优化教程
  • 电子商务网站建设一般流程图科技网站建设方案
  • 网站建设学校怎么查询公司名字是否可以注册
  • 网页制作软件dw还需要什么什么是seo和sem有什么区别
  • 建设视频网站要求吗网页设计师就业现状
  • 找人做网站多少钱商城网站制作明细
  • 做的网站适应屏幕大小广州市建设交易中心
  • 辽阳网站推广企业文化馆展厅设计
  • 怎么做能打不开漫画网站网站推广公司哪
  • 长沙网站建设设计宁波网站关键词
  • 青海军区战备建设局网站网站登录密码忘记
  • 织梦电影网站模板下载怎样做公司网站介绍
  • eclipse 网站开发学习免费下载app软件下载安装到手机
  • 代做百度首页排名价格山东网络推广优化排名
  • 商务局网站建设方案网站建设合同 附件
  • 深圳网站建设新闻网站建设捌金手指花总八
  • 如何海外网站建设怎么关闭seo综合查询
  • 个人网站制作模板响应式wordpress 浏览数
  • 什么是网站的根目录汝南县网站建设
  • 网站建设硬件开支做购物网站小图标
  • 传奇怎么建设自己的网站建立网站需要多少钱怎么样
  • 南通网站建设方案开发中企动力科技股份有限公司重庆分公司