java.util.Properties的几个坑

之前排查线上问题,发现数据源的部分配置没有生效,结果跟了下源码,发现Properties这个类的新大陆,这里记录分享下

下面的代码,大家认为输出分别是多少? 我先说结果啊,size:1 ,value: CHINA

        Properties firstProperty = new Properties();
        firstProperty.setProperty("zone", "CHINA");
        firstProperty.setProperty("time-out", "3000");

        Properties secondProperty = new Properties(firstProperty);
        secondProperty.setProperty("idle-num", "5");

        System.out.println("size: " + secondProperty.size());
        System.out.println("value: " + secondProperty.getProperty("zone"));

    原因是 Properties 这个类 实际是一个HashTable,但同时呢,他内部有个属性叫做 default

	/**
     * A property list that contains default values for any keys not
     * found in this property list.
     *
     * @serial
     */
    protected Properties defaults;

我们使用构造函数声明 Properties 时,其实只是初始化了他的default,并没有增加 hashTable.table 的值;hashTable.table的值是通过 setProperty() 函数添加的
    
所以上面的代码,SIZE=1,但是拥有default值一共2个,zone:CHINA,time-out:3000

我们有些业务代码(包括某些框架,例如我这次的线上问题,com.zaxxer.hikari.HikariConfig#setDataSourceProperties) ,是通过遍历 hashTable的键值对来操作的

这里就坑爹了,会把default值遍历不到,因为default是 Properties 的属性,并不是 hashTable的
我们正常的打开方式应该是这样的 

    Enumeration<?> enumeration = thirdProperty.propertyNames();
        while (enumeration.hasMoreElements()) {
            System.out.println(enumeration.nextElement());
    }
		
	// 因为 Properties 内部有 enumerate() 这个函数,在递归
	private synchronized void enumerate(Hashtable<String,Object> h) {
        if (defaults != null) {
            defaults.enumerate(h);
        }
        for (Enumeration<?> e = keys() ; e.hasMoreElements() ;) {
            String key = (String)e.nextElement();
            h.put(key, get(key));
        }
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值