Properties没有被注意的地方
源起:
今天阅读源码时发现一个地方不理解:
为什么以下代码第10行 get() 之后value为null时还去 getProperty() 呢?
org.springframework.util.CollectionUtils
public static <K, V> void mergePropertiesIntoMap(Properties props, Map<K, V> map) {
if (map == null) {
throw new IllegalArgumentException("Map must not be null");
} else {
String key;
Object value;
if (props != null) {
for(Enumeration en = props.propertyNames(); en.hasMoreElements(); map.put(key, value)) {
key = (String)en.nextElement();
value = props.get(key);
if (value == null) {
value = props.getProperty(key);
}
}
}
}
}
跟进去发现Properties类除了继承HashTable用于存储<K, V>数据之外,自身还持有一个
protected Properties defaults;
因此就相当于可以无限嵌套了吧。。。
测试:
Properties有些需要避坑的地方稍微整理了下:
@Test
public void javaCoreProperties () {
// public class Properties extends Hashtable<Object,Object> // 初始化时传入的作为default属性(Properties类型)存储
Properties props = new Properties(System.getProperties());
// 调用内部put方法,与put仅形参类型不同
props.setProperty("base.date", "2019-05-09");
// 相比于setProperty适用范围更广,它的形参都是Object类型
props.put("base.time", "14:15:00");
props.put("base.object", new Date()); System.out.println(props.get("base.date"));
System.out.println(props.getProperty("base.date")); System.out.println(props.get("base.time"));
System.out.println(props.getProperty("base.time")); // get与getProperty不等价
// get仅获取put进去的存储在父类HashTable中的数据
System.out.println(props.get("java.runtime.version"));
// getProperty会优先在查找父类HashTable中的数据,如果没有再到自己拥有的default中查找;查找方法依然是跟这里相同
System.out.println(props.getProperty("java.runtime.version")); // 可以获取对象
System.out.println(props.get("base.object"));
// 获取到Value对象,判断发现不是String类型,再去default中找,依然找不到,返回null
System.out.println(props.getProperty("base.object")); // Key和Value不能为空,否则抛出NPE,这是HashTable决定的,HashMap就没有这个限制
//props.put(new Object(), null); // 有校验
//props.put(null, 123); //计算Key的hashCode时引发 // 这个会引起java.lang.ClassCastException,因为list遍历时,会将Key和Value强制转化为String
//props.put(new Object(), 123);
props.put("007", "123");
props.remove("base.object"); props.list(System.out);
}
运行输出:
2019-05-09
2019-05-09
14:15:00
14:15:00
null
1.8.0_144-b01
Thu May 09 15:09:02 CST 2019
null
-- listing properties --
base.time=14:15:00
java.runtime.name=Java(TM) SE Runtime Environment
sun.boot.library.path=C:\DevBaseFiles\Java\jdk1.8.0_144\jre...
java.vm.version=25.144-b01
base.date=2019-05-09
java.vm.vendor=Oracle Corporation
...
欢迎提出意见或建议,共同进步。
Properties没有被注意的地方的更多相关文章
- Android读写properties配置文件
写这篇文章之前可以成功运行,文章后就各种找不到文件.所以并没有采用此种方式,后期完善.详见下篇解决方案. 配置文件读取很容易,修改需要注意权限,比如assets目录下就不允许修改. 配置文件的创建: ...
- xml文件 加载properties文件的两种方法与注意事项
1.遇到的问题: 配置redisSpringContext.xml 时,遇到 properties加载失败,提示BeanDefinitionStoreException 和 java.lang. ...
- C#播放wav文件
C#使用HWQPlayer类播放wav文件 类的代码: using System.IO; using System.Runtime.InteropServices; namespace HoverTr ...
- JDBC学习2:为什么要写Class.forName("XXX")?
Class.forName(String name) 接上一篇JDBC.本来这个内容是放在前面的一篇里面的一起的,后来发现越写越多,想想看就算了,还是单独开一篇文章好了,这样也能写得更加详细点. 上一 ...
- tomcat中设置多项目共享jar;类包
随着服务器上的tomcat部署的项目越来越多,最近在部署一个新的项目的时候出现内存溢出的错误 Exception in thread "main" java.lang.OutOfM ...
- Sping Boot入门到实战之入门篇(三):Spring Boot属性配置
该篇为Sping Boot入门到实战系列入门篇的第三篇.介绍Spring Boot的属性配置. 传统的Spring Web应用自定义属性一般是通过添加一个demo.properties配置文件(文 ...
- mybatis常用配置
前面两篇博客我们简单介绍了mybatis的使用,但是在mybatis的配置问题上我们只是使用了最基础的配置,本文我们就来说说其他一些常用的配置.如果小伙伴对mybatis尚不了解,可以先参考这两篇博客 ...
- tomcat和iis共用80端口的简明手册
对于使用tomcat-connector实现iis与tomcat实现80端口共用的问题,网上的信息异常混乱,很多地方误人子弟,浪费时间.本文给出简明手册式的做法: 首先列出我们需要做的事项: 1. ...
- jmeter用Windows电脑分布式部署
当然,java环境.jmeter安装我这里就不说了. 使用1个controller(imac电脑),2个agent(Windows7 系统) 一.agent配置(Windows7系统) 1.电脑环境变 ...
随机推荐
- java 相关博客
Intellij Idea 创建Web项目入门(一) SpringMVC 和 MyBatis 学习笔记,搭配示例,主要讲解一些基础的概念.用法和配置 包含框架有:SpringMVC.MyBaits.A ...
- 【Java】通过移除空行和注释来压缩 JavaScript 代码
1. [代码]JavaScriptCompressor.java/** * This file is part of the Echo Web Application Framework (herei ...
- NSDictionary字典创建,获取,遍历,可变字典的删除 - iOS
字典是以键值对的形式来存储数据 key value 1 NSDictionary 字典 1.1 创建字典,不可变的 NSDictionary * dic = [NSDictionary diction ...
- docker hub下载慢解决方法 使用daocloud的mirror
见:http://blog.csdn.net/dingsai88/article/details/52638758
- I.MX6 Android 5.1.1 下载、编译
/************************************************************************* * I.MX6 Android 5.1.1 下载. ...
- Appium+python自动化
名称 链接地址 Appium+python自动化8-Appium Python API(上) http://mp.weixin.qq.com/s/WvpT5oRrYY22avI95FuypQ Appi ...
- 文件的创建,读取,写入,修改,删除---python入门
转自:http://blog.163.com/jackylau_v/blog/static/175754040201181505158356/ 一.用Python创建一个新文件,内容是从0到9的整数, ...
- 如何用JavaScript实现获取验证码的效果
转自:http://www.php.cn/js-tutorial-411734.html HTML部分: 1 2 3 4 5 6 7 <body onload='createCode()'> ...
- mysqlerror2003错误原因以及解决方案
出现mysql #2003错误有一下几种原因 一.mysql数据库没有启动 这种情况也正是我遇到的,到windows服务选项里查看发现没有mysql数据库服务这个选项,记得刚开始安装mysql的时候是 ...
- ASP.NET Core MVC 2.x 全面教程_ASP.NET Core MVC 09. Model验证
数据注解 这样前后就会有div把这个inoput给包起来 添加一个Label使用TagHelper也有只能提示 出现的效果是这样的,实际上是把model的属性名打印出来.了. 把其他几个label也添 ...