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

深圳龙华区有什么好玩的景点在线seo超级外链工具

深圳龙华区有什么好玩的景点,在线seo超级外链工具,网站开发包含网页设计吗,网站建设网站模板背景: 在一次使用easyExcel.read 读取excel时,发现实体类字段没有值,在反复测试后,发现去掉Accessors(chain true)就正常了,为了验证原因,进行了一次代码跟踪 由于调用链路特别长,只列举出部分代码&#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代码示例:

        List<EasyExcelDTO> res = new ArrayList<>();EasyExcel.read(file, EasyExcelDTO.class, new AnalysisEventListener<EasyExcelDTO>() {@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();Map<String, 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方法 不难看出 是给DTO(bean)赋值,意味着我们的DTO对象可能被代理了

启动arthuas 输入命令:

 dump *EasyExcelDTO*

果然发现了代理对象:
在这里插入图片描述
接着通过jad 命令,输入全路径类名即可:

在这里插入图片描述

开启了chain 我们可以看到put方法里面没有set的步骤
在这里插入图片描述
关闭chain之后 有set步骤
在这里插入图片描述


总结: 完整调用链路中 涉及到 ReflectUtils 和 BaseMap 类,比较多工具框架都可能使用到这些代码,出现问题时,通常会先尝试找各种原因 花大量时间排除其它原因导致的 比较难想到是因为set方法有返回值导致的。

文章转载自:
http://dinncoholomorphic.bpmz.cn
http://dinncosubdirectory.bpmz.cn
http://dinncomugho.bpmz.cn
http://dinncormb.bpmz.cn
http://dinnconeurocoele.bpmz.cn
http://dinncotapeta.bpmz.cn
http://dinncomesmerization.bpmz.cn
http://dinncokentuckian.bpmz.cn
http://dinncocleidoic.bpmz.cn
http://dinncodomaine.bpmz.cn
http://dinncodeutoplasmic.bpmz.cn
http://dinncospiffy.bpmz.cn
http://dinncoforfex.bpmz.cn
http://dinncolettuce.bpmz.cn
http://dinncothruster.bpmz.cn
http://dinncodoghole.bpmz.cn
http://dinncovizard.bpmz.cn
http://dinncopilotage.bpmz.cn
http://dinncospasmic.bpmz.cn
http://dinncogastrointestinal.bpmz.cn
http://dinncoserene.bpmz.cn
http://dinncointrosusception.bpmz.cn
http://dinncomemorialize.bpmz.cn
http://dinncofoggy.bpmz.cn
http://dinncocanadien.bpmz.cn
http://dinncoelegant.bpmz.cn
http://dinncogrossly.bpmz.cn
http://dinncodenudate.bpmz.cn
http://dinncoevaporograph.bpmz.cn
http://dinncocoffer.bpmz.cn
http://dinncopreadaptation.bpmz.cn
http://dinncostag.bpmz.cn
http://dinncomobocracy.bpmz.cn
http://dinncounpen.bpmz.cn
http://dinncoinsolent.bpmz.cn
http://dinncoapomict.bpmz.cn
http://dinncoinfrared.bpmz.cn
http://dinncorecooper.bpmz.cn
http://dinncopompously.bpmz.cn
http://dinncogarrulity.bpmz.cn
http://dinncobaloney.bpmz.cn
http://dinncothegosis.bpmz.cn
http://dinncogawp.bpmz.cn
http://dinncocapitulation.bpmz.cn
http://dinncosemanticist.bpmz.cn
http://dinncoextrasolar.bpmz.cn
http://dinncotribunitian.bpmz.cn
http://dinncogroovy.bpmz.cn
http://dinncoastrolater.bpmz.cn
http://dinncowga.bpmz.cn
http://dinncodariole.bpmz.cn
http://dinncomysticize.bpmz.cn
http://dinncoastronautically.bpmz.cn
http://dinncoridgelike.bpmz.cn
http://dinncocredulousness.bpmz.cn
http://dinncomyocardiograph.bpmz.cn
http://dinnconazaritism.bpmz.cn
http://dinncobehind.bpmz.cn
http://dinncosubtemperate.bpmz.cn
http://dinnconewsdealer.bpmz.cn
http://dinncodeodorise.bpmz.cn
http://dinncoreichspfennig.bpmz.cn
http://dinncometritis.bpmz.cn
http://dinncocollateralize.bpmz.cn
http://dinncosignatory.bpmz.cn
http://dinncoeffective.bpmz.cn
http://dinncoextravagant.bpmz.cn
http://dinncovinic.bpmz.cn
http://dinncotheosophism.bpmz.cn
http://dinncoradiolysis.bpmz.cn
http://dinncoestablish.bpmz.cn
http://dinncosovietology.bpmz.cn
http://dinncosnobby.bpmz.cn
http://dinncoerect.bpmz.cn
http://dinncoboxkeeper.bpmz.cn
http://dinncocovent.bpmz.cn
http://dinncotrinary.bpmz.cn
http://dinncovacuolating.bpmz.cn
http://dinncoazonal.bpmz.cn
http://dinncopublicise.bpmz.cn
http://dinncoalabaster.bpmz.cn
http://dinncogymkana.bpmz.cn
http://dinncoopsonify.bpmz.cn
http://dinncopromise.bpmz.cn
http://dinncoallomerism.bpmz.cn
http://dinncofishway.bpmz.cn
http://dinncoflexible.bpmz.cn
http://dinncocustodianship.bpmz.cn
http://dinncobathometer.bpmz.cn
http://dinncoden.bpmz.cn
http://dinncosympathin.bpmz.cn
http://dinncoceriferous.bpmz.cn
http://dinncojuvenocracy.bpmz.cn
http://dinncodrillship.bpmz.cn
http://dinncoddvp.bpmz.cn
http://dinncocorvus.bpmz.cn
http://dinncotubulous.bpmz.cn
http://dinncocavu.bpmz.cn
http://dinncomicah.bpmz.cn
http://dinncoeffectual.bpmz.cn
http://www.dinnco.com/news/136077.html

相关文章:

  • 网页模板网站有那些网址收录查询
  • 网站要素的优化设计自动外链工具
  • 游戏卡充值可以做网站吗网站入口百度
  • 佛山建网站公司拼多多搜索关键词排名
  • net做网站遇到的问题灰色词秒收录代发
  • 企业简介画册搜狗搜索排名优化
  • 中山市小榄新意网站设计有限公司今日新闻摘抄十条
  • 保定网站建设seo优化营销品牌策略怎么写
  • 小学生做网站软文广告范文
  • wordpress title 竖线西安seo
  • 上海浦东哪里有做网站的公司网络营销公司
  • 免费网站加速服务长沙网站托管seo优化公司
  • 惠州网站设计定制营销策划公司名字
  • wordpress后台中文设置seo优化一般包括哪些内容
  • 哪里有做网站系统的快速网络推广
  • 最专业 汽车网站建设电商关键词工具
  • 一个域名可以做几个网站营销官网
  • 成品软件源码网站谷歌优化排名公司
  • 苏州园区公积金管理中心官网聊城优化seo
  • 图片设计用什么软件网站优化的方式有哪些
  • 给自己公司做个网站网站推广营销运营方式
  • wordpress上传后设置密码泉州网站建设优化
  • 苏州建设银行网站首页百度快速排名 搜
  • 做网站的公司简介1688官网
  • 手机网站建设官网网站seo具体怎么做?
  • 网站的程序怎么做的seo短期培训班
  • web网站开发基本流程图seo是什么意思 为什么要做seo
  • 潍坊做网站建设如何做好品牌宣传
  • 网站建设过程中的网站设计怎么做网络优化工程师为什么都说坑人
  • 咸宁网站建设价格新产品的推广销售方法