加入收藏 | 设为首页 | 会员中心 | 我要投稿 怀化站长网 (https://www.0745zz.cn/)- 语音技术、云资源管理、物联设备、云计算、决策智能!
当前位置: 首页 > 站长资讯 > 外闻 > 正文

发现了一个极度不安全的操作

发布时间:2021-02-22 14:49:12 所属栏目:外闻 来源:互联网
导读:在People类的构造方法中打印日志。 我们都清楚,正常情况下,一般构造子类对象,必然会先执行父类的构造方法。 运行一下: 没有执行父类构造方法,但对象构造出来了 这里可以猜到,Person对象的构建,并不是常规的构建对象,没有走构造方法。 那么它是怎么做

在People类的构造方法中打印日志。

我们都清楚,正常情况下,一般构造子类对象,必然会先执行父类的构造方法。

运行一下:

没有执行父类构造方法,但对象构造出来了

这里可以猜到, Person对象的构建,并不是常规的构建对象,没有走构造方法。

那么它是怎么做到的呢?

只能去Gson的源码中去找答案了。

找到其怎么做的,其实就相当于解答了我们文首的问题。

3. 追查原因

Gson这样构造出一个对象,但是没有走父类构造这种,如果真是的这样,那么是极其危险的。

会让程序完全不符合运行预期,少了一些必要逻辑。

所以我们提前说一下,大家不用太惊慌,并不是Gson很容易出现这样的情况,而是恰好上例的写法碰上了,我们一会会说清楚。

首先我们把Person这个kotlin的类,转成Java,避免背后藏了一些东西:


 

可以看到Person有一个包含两参的构造方法,并且这个构造方法中有name的空安全检查。

也就是说,正常通过这个构造方法构建一个Person对象,是不会出现空安全问题的。

那么只能去看看Gson的源码了:

Gson的逻辑,一般都是根据读取到的类型,然后找对应的TypeAdapter去处理,本例为Person对象,所以会最终走到`ReflectiveTypeAdapterFactory.create`然后返回一个TypeAdapter。

我们看一眼其内部代码:


(编辑:怀化站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读