Spring源码阅读过程中基础知识补齐
1. isAssignableFrom
isAssignableFrom是Class类下的一个native方法,用来判断某个类是否和参数中的类是同一个类或者他的父类、父接口。为了更好地了解他的使用,我们来看一看一个和他用法有些相似的instanceof。我当时看的时候一个朴素的想法就是,为啥不用instanceof。下面通过表格的一个形式展示两者之间一些区别
| instanceof | isAssignableFrom | |
|---|---|---|
| 是个啥 | 运算符 | Class类的方法 |
| 谁来用 | 对象实例 | Class对象 |
| 用处 | 判断对象是某个类的实例 | 该类能否接受参数那个类的赋值 |
| 方向 | 子->父 | 父->子 |
可以看出,主要的区别在于,instanceof是给对象实例用的,用来保证能进行安全的类型转换。而isAssignableFrom更适合只有一些类信息的情况下使用,尤其是在Spring这种框架中,用来确认某个代理对象是否是我要的类型。
举个🌰
▼Java复制代码Class<?> parentClass = List.class; Class<?> childClass = ArrayList.class; Class<?> unrelatedClass = String.class; // 判断 ArrayList 是否可以赋值给 List boolean result1 = parentClass.isAssignableFrom(childClass); // true // 判断 String 是否可以赋值给 List boolean result2 = parentClass.isAssignableFrom(unrelatedClass); // false
2. MultiValueMap
顾名思义,是一个可以一个key映射多个value的Map。在Spring处理请求头的时候用到
位于org.springframework.util包下,下面是接口定义
▼Java复制代码public interface MultiValueMap<K, V> extends Map<K, List<V>>
可以看出他就是一个Map,那么他是怎么做到一个key映射多个Value的呢?于是我们找来了一个实现类
▼Java复制代码public class LinkedMultiValueMap<K, V> extends MultiValueMapAdapter<K, V> // new public base class in 5.3 implements Serializable, Cloneable
以下类图展示两者之间关系
我们可以通过MultiValueMapAdapter的一些方法发现其实就是通过一个List将多个Value存储起来让一个key映射多个Value
▼Java复制代码public class MultiValueMapAdapter<K, V> implements MultiValueMap<K, V>, Serializable { private final Map<K, List<V>> targetMap; @Override public void add(K key, @Nullable V value) { List<V> values = this.targetMap.computeIfAbsent(key, k -> new ArrayList<>(1)); values.add(value); }
希望各位大佬来补充和指正
评论
问答助学
相关内容
0个评论
全部评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
作者分享
我服啦,老板半个月(算上测试一起)要上一个小程序,十二个模块加后台。要im,要站内信,还有好多个第三方服务。之前开会的时候还说他去了解过敏捷开发,我寻思他只看了名字吧,这也太敏捷了🤣
2
今天又发现ai一个好久之前产出的Bug,而且还有点难注意到。业务是这样的,一个商城的场景,编辑某个商品,对于多规格的商品,目前采用先删除原有的规格名和规格值,并插入新的。但是测试的时候出错了。排查日志发现是根据规格名id查询规格值的时候使用了in,但是没传入任何规格名的id,sql执行出错,向上翻日志发现查询发现是没查到对应的规格名记录(即图中queryByProductId方法),ps关于是否会有规格名在上面有严格校验。于是我去数据库里看了一下,是有数据的,而且用日志中一样的sql,也能直接查到,写了个测试类也能查到,但是接口中就是查不到。谁能想到,ai写的时候先逻辑删除了这条数据,然后紧接着去查了这条数据,当然查不到了😑
2
最近我的GLM Lite订阅马上要过期了,我在纠结到底是续期还是换MiniMax starter。先说一下我的状态吧,目前主要是配合Claude Code在日常工作中处理一些不太复杂的编码任务,目前来说,GLM能满足我的需求,但是最近智谱出了挺多问题的,我偶尔请求的时候会提示什么速率限制(按照官网的描述,订阅套餐是没有请求速率限制的)我也在群里问了,但是他们的回复很慢,甚至都不回复,这也是我有想要换订阅的一个理由吧,虽然我平时没什么问题需要解决,但我还是希望在我有问题的时候有人能给我一个回复。而且高峰期是真的挺慢的。因此我想问一下,MiniMax的使用体验怎么样,有没有人能解答一下的,而且starter的真的很便宜,比GLM Lite按年订阅单月价格还低,不过我看他们的速度应该是相当于GLM高峰期的速度,不过如果其他体验相当加上这个价格我觉得也不是不可以尝试,毕竟一个月而已,不行再换呗😂
2
if (CollectionUtils.isEmpty(userShops)) {
ValidationUtils.isTrue(false, "用户未关联门店");
}
这是今天看到的AI生成的代码,有点好笑,给大家分享一下
7
关于云图库项目knife4j依赖引入导致启动失败解决方案
4
