PROPERTIES
Intro(PROPERTIES) #
System.properties() #
在
System类中有 initProperties(Properties props); native 方法。在C代码GetJavaProperties(env);中会获取到一些props。这个方法的实现在 java_props_md.c中。在 626 行setProxyProperties(&sprops);会进行系统代理的设置。继续调用到 java_props_maxosx.c中。主要会使用 macosx SDK 中的SCDynamicStoreCopyProxies(_:)【函数调用 C Demo】, 获取当前系统中的网络代理设置。需要注意与环境变量进行区分。Prop对unicode编码的处理 #
在查看 Spring国际化(i18n) 和 ResourceBundle 相关的代码的时候,发现都会用到
Properties类相关的处理。而且对于 unicode 的处理都是由这个类去自动处理的。所以跟踪了相关代码,对这部分做一个记录。
大概的原理是:1).在 java.util.Properties#load0 读取每一行,通过=、:分割每一个key和value。在最后对key和value分别进行转换。2).调用 java.util.Properties#loadConvert 进行转换操作。转换过程:碰见\u将后面的四位使用算法转换成十进制数字,当成一个char类型的字符。在原来的数组上面进行覆盖。相关算法如下图:
Caution
比如将
\u4f60转成字符char20320. 过程如下:
第一个字符'4',进到循环后,执行(value << 4) + aChar - '0';此时 value = 0,左移四位还是0 ,再加上字符'4'表示的整型值 4 (正好是当前字符'4'与'0'字符的差值) 最后value =0100;
第二个字符'f',进来后执行(value << 4) + 10 + aChar - 'a';此时将上一步得到的value 左移四位,得到0100 0000然后与实际值('f'表示的整型值 151111)想加,即得到0100 1111。
依此类推:最终得到的value =0100 1111 0110 0000=20320。
Reference #